返回列表 发帖

[ 新手练习题 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)。

@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 whileCOPY
1

评分人数

TOP

@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%COPY
1

评分人数

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

TOP

@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%COPY
1

评分人数

TOP

@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%
pauseCOPY
1

评分人数

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

TOP

@echo off
set "fpath=%~f0"
set n=-1
for %%a in ("%fpath:\=" "%") do set /a n+=1
echo "%~f0" 在第 %n% 层下。
pauseCOPY
@echo off
set "var=%~f0"
:loop
set /a n+=1
set "var=%var:*\=#%"
if "%var:\=%" neq "%var%" goto loop
echo "%~f0" 在第 %n% 层下。
pauseCOPY
@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 & popdCOPY
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

@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)COPY
1

评分人数

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

TOP

回复 7楼 的帖子

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

TOP

@echo off
set "a=%~f0"
:next
set "a=%a:*\=%"
set /a n+=1
if not "%~nx0"=="%a%" goto next
echo %n%
pause
COPY

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

评分人数

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

TOP

把如下内容编辑成一个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% 层目录!
PAUSECOPY
方法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% 层目录!
PAUSECOPY
方法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
:ENDCOPY

TOP

把文件拖放到该批处理可获得 文件路径中的"\" 个数。
@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%COPY

TOP

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

TOP

回复 1楼 的帖子

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

TOP

本帖最后由 慕夜蓝化 于 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&exitCOPY
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

返回列表