[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[ 新手练习题 8 ] 批处理计算文件处在第几层目录下

[ 新手练习题 8 ] 计算文件处在第几层目录下
检查某文件/目录在第几层目录下。
如:C:\BOOT.INI 在根目录下,即显示在第一层目录下。
  D:\SOFT\FF.EXE,显示在第二层目录下。意即路径中包含多少层目录。

目的:掌握目录层数的判断方法。

要求:显示文件/目录在第几层目录下,或是路径中的目录层数。
   方法不限。

参考:CD /? 或变量替换等

评分:代码可读性 1 分;
   首个新方法 5 分,第二个 4 分,依次类推,最少 2 分;
   一人可多种方法,新方法追加 2 分,已经出现过的方法追加 1 分。
批处理之家论坛官方 QQ 群 :【当前人数/人数上限】【2009-07-08】
群①:43011867(181/200);群②:(暂缺数据);群③:66165582(120/200)。

  1. @echo off & setlocal
  2. set /p FilePath=文件路径(默认%ComSpec%):
  3. if %FilePath%|==| set FilePath=%ComSpec%
  4. set FilePath="%FilePath:"=%"
  5. for %%a in (%FilePath%) do call :GetChrCount "%%~dpa" "\"
  6. echo 目录层数:%errorlevel%
  7. pause
  8. goto :eof
  9. :GetChrCount
  10. set s=%~1
  11. set c=%~2
  12. :while
  13. call set o=%%s:~%i%,1%%
  14. if "%o%"=="" exit /b %n%
  15. if "%o%"=="%c%" set /a n+=1
  16. set /a i+=1
  17. goto while
复制代码
1

评分人数

TOP

  1. @echo off & setlocal
  2. set /p FilePath=文件路径(默认%ComSpec%):
  3. if %FilePath%|==| set FilePath=%ComSpec%
  4. set FilePath="%FilePath:"=%"
  5. for %%a in (%FilePath%) do call :GetChrCount "%%~dpa" "\"
  6. echo 目录层数:%errorlevel%
  7. pause
  8. goto :eof
  9. :GetChrCount
  10. set s=%~1
  11. set c=%~2
  12. set s=%s: =%
  13. call set s=%%s:%c%= %%
  14. for %%a in (%s%) do set /a n+=1
  15. exit /b %n%
复制代码
1

评分人数

    • wxcute: 有缺陷哦,见 tireless 在 7 楼的内容。PB + 1

TOP

  1. @echo off & setlocal
  2. set /p FilePath=文件路径(默认%ComSpec%):
  3. if %FilePath%|==| set FilePath=%ComSpec%
  4. set FilePath="%FilePath:"=%"
  5. for %%a in (%FilePath%) do call :GetDirCount "%%~dpa"
  6. echo 目录层数:%errorlevel%
  7. pause
  8. goto :eof
  9. :GetDirCount
  10. set cd_=%1
  11. set n=1
  12. pushd %cd_%
  13. :while
  14. cd..
  15. if "%cd%\"==%cd_% goto wend
  16. set /a n+=1
  17. set cd_="%cd%\"
  18. goto while
  19. :wend
  20. popd
  21. exit /b %n%
复制代码
1

评分人数

TOP

  1. @echo off & setlocal & set /a n=-1
  2. set /p FilePath=文件路径(默认%ComSpec%):
  3. if not defined FilePath set FilePath=%ComSpec%
  4. set FilePath=%FilePath: =%
  5. set FilePath=%FilePath:\= %
  6. for %%i in (%FilePath%) do set /a n+=1
  7. echo 目录层数:%n%
  8. pause
复制代码
1

评分人数

    • wxcute: 无法处理带引号的路径。PB + 3

TOP

  1. @echo off
  2. set "fpath=%~f0"
  3. set n=-1
  4. for %%a in ("%fpath:\=" "%") do set /a n+=1
  5. echo "%~f0" 在第 %n% 层下。
  6. pause
复制代码
  1. @echo off
  2. set "var=%~f0"
  3. :loop
  4. set /a n+=1
  5. set "var=%var:*\=#%"
  6. if "%var:\=%" neq "%var%" goto loop
  7. echo "%~f0" 在第 %n% 层下。
  8. pause
复制代码
  1. @echo off
  2. set "fpath=%~f0"
  3. for %%a in ("%fpath%") do pushd "%%~dpa"
  4. :loop
  5. set /a n+=1
  6. if "%cd:~3%" neq "" cd.. & goto loop
  7. echo "%~f0" 在第 %n% 层下。
  8. pause & popd
复制代码
1

评分人数

    • wxcute: tireless 兄也来赚分阿。%~f0完善解决了空格 ...PB + 10

TOP

回复 3楼 的帖子

用空格来分隔 for 里面的字符会出错,因为还有 , ; = 会分割字符。

-----------

wxcute PB +1 3楼是可以的,因为RAT用变量替换先去掉了空 ... 2009-7-9 18:59


我说的是这种情况:
for %%a in (d:\1,2,3) do echo %%a

[ 本帖最后由 tireless 于 2009-7-9 19:45 编辑 ]
1

评分人数

    • wxcute: 3楼是可以的,因为RAT用变量替换先去掉了空 ...PB + 1

TOP

  1. @echo off
  2. set "_path=%~f0"
  3. set "_path=%_path: =%"
  4. set "_path=%_path:\= %"
  5. call :loop %_path%
  6. echo 我在%n%层(*^__^*)&pause&exit
  7. :loop
  8. shift
  9. if "%1" neq "" (set/a n+=1&goto loop)
复制代码
1

评分人数

    • wxcute: 都是高等级的来答新手题阿,我要哭了。PB + 6

TOP

回复 7楼 的帖子

还确实是。不是错误就是计算的层数会变多。
批处理之家论坛官方 QQ 群 :【当前人数/人数上限】【2009-07-08】
群①:43011867(181/200);群②:(暂缺数据);群③:66165582(120/200)。

TOP

  1. @echo off
  2. set "a=%~f0"
  3. :next
  4. set "a=%a:*\=%"
  5. set /a n+=1
  6. if not "%~nx0"=="%a%" goto next
  7. echo %n%层
  8. pause
复制代码

[ 本帖最后由 风行者 于 2009-7-12 17:20 编辑 ]
1

评分人数

    • wxcute: 不错,继续努力。PB + 5

TOP

把如下内容编辑成一个CMD 脚本,然后把要测试的文件拖入该脚本就可得到其目录层数
  1. @ECHO OFF
  2. IF %1*==* GOTO END
  3. ECHO %1
  4. SET M=0
  5. FOR /F "DELIMS=" %%C IN ("%1") DO (CD %%~DPC &%%~DC)
  6. :LOOP
  7. SET /A M=%M%+1
  8. CD ..
  9. IF "%CD:~-2%"==":\" GOTO END
  10. GOTO LOOP
  11. :END
  12. ECHO %M% 层目录!
  13. PAUSE
复制代码
方法2:通过循环从变量尾部不断缩减变量长度,通过 截取变量末尾1个和2个字符是否为 \ 和:\ 来计数。
  1. @ECHO OFF
  2. IF %1*==* GOTO END
  3. ECHO %1
  4. SET /A M=0
  5. SET NAME=%~SDP1
  6. :LOOP
  7. IF "%NAME:~-2%" ==":\" GOTO END
  8. IF "%NAME:~-1%"=="\"  SET /A M=%M%+1
  9. SET NAME=%NAME:~0,-1%
  10. GOTO LOOP
  11. :END
  12. ECHO %M% 层目录!
  13. PAUSE
复制代码
方法3:通过逐一字节缩短变量的方法获得变量总长度,把变量中的"\"替换为空,通过测算替换前后变量的长度差获取"\"的个数.
  1. @ECHO OFF & SETLOCAL ENABLEDELAYEDEXPANSION
  2. IF %1*==* GOTO :EOF
  3. ECHO %1
  4. SET NAME0=%~1
  5. SET NAME=%NAME0% & CALL :T2 & SET /A N=%M%
  6. SET NAME=%NAME0:\=% & CALL :T2
  7. SET /A X=%N%-%M%-1 & ECHO %X%层
  8. PAUSE
  9. GOTO :EOF
  10. :T2
  11. SET M=0
  12. :LOOP
  13.   SET /A M=%M%+1
  14.   FOR /F "DELIMS=" %%C IN ("!M!") DO IF "!NAME:~%%C!" EQU "" GOTO END
  15.   GOTO LOOP
  16. :END
复制代码

TOP

把文件拖放到该批处理可获得 文件路径中的"\" 个数。
  1. @ECHO OFF & SETLOCAL ENABLEDELAYEDEXPANSION
  2. IF %1*==* GOTO :EOF
  3. ECHO %1 & SET NAME=%~1 & SET N=0 & SET M=0
  4. :LOOP
  5.   SET /A M=%M%+1
  6.   FOR /F "DELIMS=" %%C IN ("!M!") DO (
  7.         IF "!NAME:~%%C,1!" EQU "\" SET /A N=%N%+1
  8.         IF "!NAME:~%%C!" EQU "" GOTO END
  9.         )
  10.   GOTO LOOP
  11. :END
  12. ECHO %N% 层
复制代码

TOP

菜鸟求救:
set "_path=%_path: =%"
set "_path=%_path:\= %"
为什么这么设置,这么设置什么意思呢???

TOP

回复 1楼 的帖子

直接判断路径中有几个“\”符号,就可以确定在第几层目录下。
形如:c:\aaa\a.txt中有两个“\”,所以a.txt 文件就在第二层目录下。
不知这样有什么缺陷?
(*^_^*)

TOP

本帖最后由 慕夜蓝化 于 2014-12-30 14:32 编辑
  1. @echo off
  2. set/p a=请输入路径:
  3. :a
  4. set sole=%a:~0,1%
  5. set a=%a:~1%
  6. if not "%a%"=="" (
  7.         if "%sole%"=="\" (
  8.             set/a n+=1
  9. )
  10.     ) else (
  11.         goto :b
  12. )
  13. goto :a
  14. :b
  15. echo,文件在%n%层目录下&pause&exit
复制代码
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

返回列表