标题: [其他] [已解决]有没有可以指定显示深度的 Tree 第三方程序? [打印本页]
作者: hnfeng 时间: 2023-3-20 17:03 标题: [已解决]有没有可以指定显示深度的 Tree 第三方程序?
本帖最后由 hnfeng 于 2023-3-22 09:26 编辑
Windows 里有个 Tree 命令,可以显示目录树,但是功能太简单了,不能指定显示深度,只能扫描全部目录。我想要能指定显示深度(目录的级数)的功能
Linux 下的 tree 命令原生支持,例如 显示深度为3级:复制代码
但是在 windows里就难了。找了好久,貌似 Powershell 里面可以实现(show-tree),但是需要windows10以上系统安装一些东西(如果在windows7里面,需要安装更多),常常还安装失败。但是这个功能需要在其他电脑使用,都安装的话……太过麻烦了。
第三方命令行工具, 我也找了好久了,没找到。
虽然可以用 excel 的 VBA 把 Tree 结果处理一下,但是 步骤多,不方便,而且需要先 tree 全目录,再由 VBA 删掉超过深度的行,也较麻烦。
后来又想到使用 robocopy 来解决…………
总之,谁知道哪里有此软件?
先谢谢了
作者: terse 时间: 2023-3-20 17:08
递归DIR试试呢
作者: hnfeng 时间: 2023-3-20 17:28
递归DIR试试呢
terse 发表于 2023-3-20 17:08
我想要的结果是 目录树,递归 dir 能实现吗
作者: terse 时间: 2023-3-21 11:56
回复 3# hnfeng
显示不太标准- @echo off
- REM 存为ANSI编码
- set "folder=c:\test"
- set /a num=0, max=5
- echo;%folder%
- call :loop "%folder%"
- pause&exit
- :loop
- pushd %1
- if %num% lss %max% (
- for /d %%d in (*) do (
- if %num% geq 1 (
- set /p=│ <nul
- )else set /p=├─<nul
- for /l %%i in (1,1,%num%) do (
- if %%i neq %num% (
- set /p=│ <nul
- ) else set /p=└─<nul
- )
- echo;%%d
- set /a num+=1
- call :loop "%%d"
- set /a num-=1
- )
- )
- popd
- exit/b
复制代码
作者: hnfeng 时间: 2023-3-21 18:52
回复 hnfeng
显示不太标准
terse 发表于 2023-3-21 11:56
高手,厉害!不过显示的确实不标准,文件夹的上下级关系看起来也不明了。比 tree 命令的差些
作者: newswan 时间: 2023-3-21 19:10
Linux tree
ps get-childitem
都可以指定深度
作者: terse 时间: 2023-3-21 19:13
回复 5# hnfeng
这个只能玩玩 ,通用不了的;
这样会好一些吗- @echo off&setlocal enabledelayedexpansion
- REM 存为ANSI编码
- for /f "delims=" %%i in ('"cmd /k prompt $h <nul"') do set bs=%%i
- set "ph=c:\test"
- set "num=0"
- set "max=6"
- call :loop %ph%
- pause
- exit
- :loop
- setlocal
- if %num%==%max% exit /b
- if %num%==0 (
- echo %ph%
- ) else (
- set "s="
- for /L %%i in (1,1,%num%) do (
- if %%i equ 1 (set "s=!s! │") else set "s=!s! │!bs!"
- )
- if %num% neq 1 (
- set /p= !s!│!bs!<nul
- echo └─%~nx1
- ) else echo ├─%~nx1
- )
- set /a "num+=1"
- for /d %%d in ("%~1\*") do call :loop "%%~fd"
- endlocal
- exit /b
复制代码
作者: buyiyang 时间: 2023-3-21 21:20
tree for winsowshttps://gnuwin32.sourceforge.net/packages/tree.htm
作者: hnfeng 时间: 2023-3-22 08:18
本帖最后由 hnfeng 于 2023-3-22 08:31 编辑
回复 7# terse
谢谢了。批处理实现这个比较难的。目前我知道的最好的办法是借用 robocopy
作者: hnfeng 时间: 2023-3-22 08:32
tree for winsows
buyiyang 发表于 2023-3-21 21:20
多谢!我去研究一下这个
作者: hnfeng 时间: 2023-3-22 09:25
tree for winsows
buyiyang 发表于 2023-3-21 21:20
这个功能强大,完美解决。多谢多谢。
建议网站收录到第三方软件库里面
作者: aloha20200628 时间: 2023-3-22 23:21
windows自带的tree若采用 tree /a 参数输出格式,可确保每行中'树杈'字符的位序一致。
基于此,用纯P代码过滤其输出结果,可以实现指定深度的目录树结构显示。试试如下代码》
- @echo off
- set "dirF=" &set/p "dirF=拖入一个目录:"
- if not defined dirF exit/b
- set "n=" &set/p "n=指定输出目录树的深度(层级):"
- if not defined n exit/b
- set "dirF=%dirF:"=%"
- tree /a "%dirF%">tree.0
- set/a "d=4,an=(n-1)*d"
- setlocal enabledelayedexpansion
- echo,%dirF%
- for /f "skip=2 delims=" %%s in (tree.0) do (
- set "t=%%s" &set "tn=!t:~%an%,1!"
- if "!tn!" equ "+" (echo,%%s)
- if "!tn!" equ "\" (echo,%%s)
- if "!tn!" neq "+" if "!tn!" neq "\" (
- (call :checkAllHad "-" "!t:~,%an%!" %an% allHad)
- if !allHad! equ 1 (echo,%%s)
- )
- )
- (del/q tree.0)&endlocal&pause&exit/b
- ::——————
- :checkAllHad //%1=字符 %2=字符串 %3=字符串长度 %4=返回值变量名
- set "str=%~2" &set/a "m=%~3-1"
- for /L %%k in (0,1,!m!) do (
- if "!str:~%%k,1!" equ "%~1" (set "%~4=1" &exit/b)
- )
- set "%~4=0"
- exit/b
复制代码
作者: hnfeng 时间: 2023-3-23 08:25
windows自带的tree若采用 tree /a 参数输出格式,可确保每行中'树杈'字符的位序一致。
基于此,用纯P代码过 ...
aloha20200628 发表于 2023-3-22 23:21
太厉害了!高手!多谢多谢
可以完美实现,而且代码精炼,佩服佩服
作者: hnfeng 时间: 2023-3-23 08:33
总结一下目前较好的三种方法:
1、使用 Tree For Windows(8楼)- tree -d -N -L 3 --charset gb2312 "c:\Program Files"
复制代码
2、使用 aloha20200628 的批处理(12楼)
3、借用 robocopy,先复制指定文件夹的指定深度的目录结构到一个临时文件夹- robocopy /create /e /lev:%Depth% /r:0 /w:0 "%SourDir%" "%TempDir%" /xf *.*
复制代码
然后 Tree 这个临时文件夹得到结果,最后 RD /s /q 掉临时文件夹
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |