Board logo

标题: [其他] [已解决]有没有可以指定显示深度的 Tree 第三方程序? [打印本页]

作者: hnfeng    时间: 2023-3-20 17:03     标题: [已解决]有没有可以指定显示深度的 Tree 第三方程序?

本帖最后由 hnfeng 于 2023-3-22 09:26 编辑

Windows 里有个 Tree 命令,可以显示目录树,但是功能太简单了,不能指定显示深度,只能扫描全部目录。我想要能指定显示深度(目录的级数)的功能
Linux 下的 tree 命令原生支持,例如 显示深度为3级:
  1. tree -d -L3
复制代码
但是在 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
显示不太标准
  1. @echo off
  2. REM 存为ANSI编码
  3. set "folder=c:\test"
  4. set /a num=0, max=5
  5. echo;%folder%
  6. call :loop "%folder%"
  7. pause&exit
  8. :loop
  9. pushd %1
  10. if %num% lss %max% (
  11.     for /d %%d in (*) do (
  12.          if %num% geq 1 (
  13.             set /p=│ <nul
  14.          )else set /p=├─<nul
  15.          for /l %%i in (1,1,%num%) do (
  16.               if %%i neq %num% (
  17.                 set /p=│ <nul
  18.               ) else set /p=└─<nul
  19.          )
  20.          echo;%%d
  21.          set /a num+=1
  22.          call :loop "%%d"
  23.          set /a num-=1
  24.     )
  25. )
  26. popd
  27. 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
这个只能玩玩 ,通用不了的;
这样会好一些吗
  1. @echo off&setlocal enabledelayedexpansion
  2. REM 存为ANSI编码
  3. for /f "delims=" %%i in ('"cmd /k prompt $h <nul"') do set bs=%%i
  4. set "ph=c:\test"
  5. set "num=0"
  6. set "max=6"
  7. call :loop %ph%
  8. pause
  9. exit
  10. :loop
  11. setlocal
  12. if %num%==%max% exit /b
  13. if %num%==0 (
  14.     echo %ph%
  15. ) else (
  16.     set "s="
  17.     for /L %%i in (1,1,%num%) do (
  18.          if %%i equ  1  (set "s=!s! │") else set "s=!s! │!bs!"
  19.     )
  20.     if %num% neq 1 (
  21.         set /p= !s!│!bs!<nul
  22.         echo └─%~nx1
  23.     ) else echo ├─%~nx1
  24. )
  25. set /a "num+=1"
  26. for /d %%d in ("%~1\*") do call :loop "%%~fd"
  27. endlocal
  28. 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代码过滤其输出结果,可以实现指定深度的目录树结构显示。试试如下代码》
  1. @echo off
  2. set "dirF=" &set/p "dirF=拖入一个目录:"
  3. if not defined dirF exit/b
  4. set "n=" &set/p "n=指定输出目录树的深度(层级):"
  5. if not defined n exit/b
  6. set "dirF=%dirF:"=%"
  7. tree /a "%dirF%">tree.0
  8. set/a "d=4,an=(n-1)*d"
  9. setlocal enabledelayedexpansion
  10. echo,%dirF%
  11. for /f "skip=2 delims=" %%s in (tree.0) do (
  12.     set "t=%%s" &set "tn=!t:~%an%,1!"
  13.     if "!tn!" equ "+" (echo,%%s)
  14.     if "!tn!" equ "\" (echo,%%s)
  15.     if "!tn!" neq "+" if "!tn!" neq "\" (
  16.         (call :checkAllHad "-" "!t:~,%an%!" %an% allHad)
  17.         if !allHad! equ 1 (echo,%%s)
  18.     )
  19. )
  20. (del/q tree.0)&endlocal&pause&exit/b
  21. ::——————
  22. :checkAllHad //%1=字符 %2=字符串 %3=字符串长度 %4=返回值变量名
  23. set "str=%~2" &set/a "m=%~3-1"
  24. for /L %%k in (0,1,!m!) do (
  25.     if "!str:~%%k,1!" equ "%~1" (set "%~4=1" &exit/b)
  26. )
  27. set "%~4=0"
  28. 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楼)
  1. tree -d -N -L 3 --charset gb2312 "c:\Program Files"
复制代码
2、使用 aloha20200628 的批处理(12楼)
3、借用 robocopy,先复制指定文件夹的指定深度的目录结构到一个临时文件夹
  1. 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