标题: [ 新手练习题 8 ] 批处理计算文件处在第几层目录下 [打印本页]
作者: wxcute 时间: 2009-7-8 21:04 标题: [ 新手练习题 8 ] 批处理计算文件处在第几层目录下
[ 新手练习题 8 ] 计算文件处在第几层目录下
检查某文件/目录在第几层目录下。
如:C:\BOOT.INI 在根目录下,即显示在第一层目录下。
D:\SOFT\FF.EXE,显示在第二层目录下。意即路径中包含多少层目录。
目的:掌握目录层数的判断方法。
要求:显示文件/目录在第几层目录下,或是路径中的目录层数。
方法不限。
参考:CD /? 或变量替换等
评分:代码可读性 1 分;
首个新方法 5 分,第二个 4 分,依次类推,最少 2 分;
一人可多种方法,新方法追加 2 分,已经出现过的方法追加 1 分。
作者: rat 时间: 2009-7-8 23:54
- @echo off & setlocal
- set /p FilePath=文件路径(默认%ComSpec%):
- if %FilePath%|==| set FilePath=%ComSpec%
- set FilePath="%FilePath:"=%"
- for %%a in (%FilePath%) do call :GetChrCount "%%~dpa" "\"
- echo 目录层数:%errorlevel%
- pause
- goto :eof
-
- :GetChrCount
- set s=%~1
- set c=%~2
- :while
- call set o=%%s:~%i%,1%%
- if "%o%"=="" exit /b %n%
- if "%o%"=="%c%" set /a n+=1
- set /a i+=1
- goto while
复制代码
作者: rat 时间: 2009-7-9 00:17
- @echo off & setlocal
- set /p FilePath=文件路径(默认%ComSpec%):
- if %FilePath%|==| set FilePath=%ComSpec%
- set FilePath="%FilePath:"=%"
- for %%a in (%FilePath%) do call :GetChrCount "%%~dpa" "\"
- echo 目录层数:%errorlevel%
- pause
- goto :eof
-
- :GetChrCount
- set s=%~1
- set c=%~2
- set s=%s: =%
- call set s=%%s:%c%= %%
- for %%a in (%s%) do set /a n+=1
- exit /b %n%
复制代码
作者: rat 时间: 2009-7-9 00:37
- @echo off & setlocal
- set /p FilePath=文件路径(默认%ComSpec%):
- if %FilePath%|==| set FilePath=%ComSpec%
- set FilePath="%FilePath:"=%"
- for %%a in (%FilePath%) do call :GetDirCount "%%~dpa"
- echo 目录层数:%errorlevel%
- pause
- goto :eof
-
- :GetDirCount
- set cd_=%1
- set n=1
- pushd %cd_%
- :while
- cd..
- if "%cd%\"==%cd_% goto wend
- set /a n+=1
- set cd_="%cd%\"
- goto while
- :wend
- popd
- exit /b %n%
复制代码
作者: FOR 时间: 2009-7-9 01:20
- @echo off & setlocal & set /a n=-1
- set /p FilePath=文件路径(默认%ComSpec%):
- if not defined FilePath set FilePath=%ComSpec%
- set FilePath=%FilePath: =%
- set FilePath=%FilePath:\= %
- for %%i in (%FilePath%) do set /a n+=1
- echo 目录层数:%n%
- pause
复制代码
作者: tireless 时间: 2009-7-9 02:01
- @echo off
- set "fpath=%~f0"
- set n=-1
- for %%a in ("%fpath:\=" "%") do set /a n+=1
- echo "%~f0" 在第 %n% 层下。
- pause
复制代码
- @echo off
- set "var=%~f0"
-
- :loop
- set /a n+=1
- set "var=%var:*\=#%"
- if "%var:\=%" neq "%var%" goto loop
-
- echo "%~f0" 在第 %n% 层下。
- pause
复制代码
- @echo off
- set "fpath=%~f0"
- for %%a in ("%fpath%") do pushd "%%~dpa"
-
- :loop
- set /a n+=1
- if "%cd:~3%" neq "" cd.. & goto loop
-
- echo "%~f0" 在第 %n% 层下。
- pause & popd
复制代码
作者: tireless 时间: 2009-7-9 02:04 标题: 回复 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 编辑 ]
作者: zhouyongjun 时间: 2009-7-9 10:41
- @echo off
- set "_path=%~f0"
- set "_path=%_path: =%"
- set "_path=%_path:\= %"
- call :loop %_path%
- echo 我在%n%层(*^__^*)&pause&exit
- :loop
- shift
- if "%1" neq "" (set/a n+=1&goto loop)
复制代码
作者: wxcute 时间: 2009-7-9 20:51 标题: 回复 7楼 的帖子
还确实是。不是错误就是计算的层数会变多。
作者: 风行者 时间: 2009-7-12 17:15
-
- @echo off
- set "a=%~f0"
- :next
- set "a=%a:*\=%"
- set /a n+=1
- if not "%~nx0"=="%a%" goto next
- echo %n%层
- pause
-
复制代码
[ 本帖最后由 风行者 于 2009-7-12 17:20 编辑 ]
作者: DXSX 时间: 2009-8-26 09:39
把如下内容编辑成一个CMD 脚本,然后把要测试的文件拖入该脚本就可得到其目录层数- @ECHO OFF
- IF %1*==* GOTO END
- ECHO %1
- SET M=0
- FOR /F "DELIMS=" %%C IN ("%1") DO (CD %%~DPC &%%~DC)
- :LOOP
- SET /A M=%M%+1
- CD ..
- IF "%CD:~-2%"==":\" GOTO END
- GOTO LOOP
- :END
- ECHO %M% 层目录!
- PAUSE
复制代码
方法2:通过循环从变量尾部不断缩减变量长度,通过 截取变量末尾1个和2个字符是否为 \ 和:\ 来计数。- @ECHO OFF
- IF %1*==* GOTO END
- ECHO %1
- SET /A M=0
- SET NAME=%~SDP1
- :LOOP
- IF "%NAME:~-2%" ==":\" GOTO END
- IF "%NAME:~-1%"=="\" SET /A M=%M%+1
- SET NAME=%NAME:~0,-1%
- GOTO LOOP
- :END
- ECHO %M% 层目录!
- PAUSE
复制代码
方法3:通过逐一字节缩短变量的方法获得变量总长度,把变量中的"\"替换为空,通过测算替换前后变量的长度差获取"\"的个数.- @ECHO OFF & SETLOCAL ENABLEDELAYEDEXPANSION
- IF %1*==* GOTO :EOF
- ECHO %1
- SET NAME0=%~1
- SET NAME=%NAME0% & CALL :T2 & SET /A N=%M%
- SET NAME=%NAME0:\=% & CALL :T2
- SET /A X=%N%-%M%-1 & ECHO %X%层
- PAUSE
- GOTO :EOF
- :T2
- SET M=0
- :LOOP
- SET /A M=%M%+1
- FOR /F "DELIMS=" %%C IN ("!M!") DO IF "!NAME:~%%C!" EQU "" GOTO END
- GOTO LOOP
- :END
复制代码
作者: DXSX 时间: 2009-8-26 20:31
把文件拖放到该批处理可获得 文件路径中的"\" 个数。- @ECHO OFF & SETLOCAL ENABLEDELAYEDEXPANSION
- IF %1*==* GOTO :EOF
- ECHO %1 & SET NAME=%~1 & SET N=0 & SET M=0
- :LOOP
- SET /A M=%M%+1
- FOR /F "DELIMS=" %%C IN ("!M!") DO (
- IF "!NAME:~%%C,1!" EQU "\" SET /A N=%N%+1
- IF "!NAME:~%%C!" EQU "" GOTO END
- )
- GOTO LOOP
- :END
- ECHO %N% 层
复制代码
作者: cs19860814 时间: 2009-8-27 08:37
菜鸟求救:
set "_path=%_path: =%"
set "_path=%_path:\= %"
为什么这么设置,这么设置什么意思呢???
作者: keen 时间: 2009-9-28 17:49 标题: 回复 1楼 的帖子
直接判断路径中有几个“\”符号,就可以确定在第几层目录下。
形如:c:\aaa\a.txt中有两个“\”,所以a.txt 文件就在第二层目录下。
不知这样有什么缺陷?
作者: 慕夜蓝化 时间: 2014-12-30 14:31
本帖最后由 慕夜蓝化 于 2014-12-30 14:32 编辑
- @echo off
- set/p a=请输入路径:
- :a
- set sole=%a:~0,1%
- set a=%a:~1%
- if not "%a%"=="" (
- if "%sole%"=="\" (
- set/a n+=1
- )
- ) else (
- goto :b
- )
- goto :a
- :b
- echo,文件在%n%层目录下&pause&exit
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |