找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 27600|回复: 14

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

[复制链接]
发表于 2009-7-8 21:04:42 | 显示全部楼层 |阅读模式
[ 新手练习题 8 ] 计算文件处在第几层目录下
检查某文件/目录在第几层目录下。
如:C:\BOOT.INI 在根目录下,即显示在第一层目录下。
  D:\SOFT\FF.EXE,显示在第二层目录下。意即路径中包含多少层目录。

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

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

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

评分:代码可读性 1 分;
   首个新方法 5 分,第二个 4 分,依次类推,最少 2 分;
   一人可多种方法,新方法追加 2 分,已经出现过的方法追加 1 分。
发表于 2009-7-8 23:54:24 | 显示全部楼层
  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
复制代码

评分

参与人数 1PB +2 收起 理由
wxcute + 2 版主少加点分

查看全部评分

发表于 2009-7-9 00:17:08 | 显示全部楼层
  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%
复制代码

评分

参与人数 1PB +1 收起 理由
wxcute + 1 有缺陷哦,见 tireless 在 7 楼的内容。

查看全部评分

发表于 2009-7-9 00:37:34 | 显示全部楼层
  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%
复制代码

评分

参与人数 1PB +2 收起 理由
wxcute + 2 不能再多了^_^

查看全部评分

发表于 2009-7-9 01:20:03 | 显示全部楼层
  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
复制代码

评分

参与人数 1PB +3 收起 理由
wxcute + 3 无法处理带引号的路径。

查看全部评分

发表于 2009-7-9 02:01:16 | 显示全部楼层
  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
复制代码

评分

参与人数 1PB +10 收起 理由
wxcute + 10 tireless 兄也来赚分阿。%~f0完善解决了空格 ...

查看全部评分

发表于 2009-7-9 02:04:55 | 显示全部楼层

回复 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 编辑 ]

评分

参与人数 1PB +1 收起 理由
wxcute + 1 3楼是可以的,因为RAT用变量替换先去掉了空 ...

查看全部评分

发表于 2009-7-9 10:41:10 | 显示全部楼层
  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)
复制代码

评分

参与人数 1PB +6 收起 理由
wxcute + 6 都是高等级的来答新手题阿,我要哭了。

查看全部评分

 楼主| 发表于 2009-7-9 20:51:09 | 显示全部楼层

回复 7楼 的帖子

还确实是。不是错误就是计算的层数会变多。
发表于 2009-7-12 17:15:11 | 显示全部楼层

  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 编辑 ]

评分

参与人数 1PB +5 收起 理由
wxcute + 5 不错,继续努力。

查看全部评分

发表于 2009-8-26 09:39:48 | 显示全部楼层
把如下内容编辑成一个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
复制代码
发表于 2009-8-26 20:31:35 | 显示全部楼层
把文件拖放到该批处理可获得 文件路径中的"\" 个数。
  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% 层
复制代码
发表于 2009-8-27 08:37:49 | 显示全部楼层
菜鸟求救:
set "_path=%_path: =%"
set "_path=%_path:\= %"
为什么这么设置,这么设置什么意思呢???
发表于 2009-9-28 17:49:23 | 显示全部楼层

回复 1楼 的帖子

直接判断路径中有几个“\”符号,就可以确定在第几层目录下。
形如:c:\aaa\a.txt中有两个“\”,所以a.txt 文件就在第二层目录下。
不知这样有什么缺陷?
发表于 2014-12-30 14:31:03 | 显示全部楼层
本帖最后由 慕夜蓝化 于 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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:02 , Processed in 0.024419 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表