我有一些目录路径,比如“C:\dir 1\dir2\dir3”。我希望在循环的每次迭代中使用更高的父目录,即“C:\dir 1\dir2\dir3”,然后“C:\dir 1\dir2”,然后“C:\dir 1”。
我的批处理脚本只会向上导航一级,然后卡在那里。 这是我的脚本的简化版本:
@echo off
setlocal enabledelayedexpansion
set FolderPath="C:\dir 1\dir2\dir3"
:DOWHILE
echo Checking contents of !FolderPath!
echo Doing some stuff
echo FolderPath before strip: !FolderPath!
for /d %%X in (!FolderPath!) do set ParentPath="%%~dpX"
echo ParentPath !ParentPath!
Set "FolderPath=!ParentPath!"
echo FolderPath after strip: !FolderPath!
pause
if NOT !FolderPath!=="" goto :DOWHILE
endlocal
我的控制台响应是:
Checking contents of "C:\dir 1\dir2\dir3"
Doing some stuff
FolderPath before strip: "C:\dir 1\dir2\dir3"
ParentPath "C:\dir 1\dir2\"
FolderPath after strip: "C:\dir 1\dir2\"
Press any key to continue . . .
Checking contents of "C:\dir 1\dir2\"
Doing some stuff
FolderPath before strip: "C:\dir 1\dir2\"
ParentPath "C:\dir 1\dir2\"
FolderPath after strip: "C:\dir 1\dir2\"
Press any key to continue . . .
我唯一注意到的是我的初始路径上缺少 \ 。 我对批处理脚本非常陌生,所以很明显我花了几个小时错过了一些事情。
@ECHO OFF
setlocal enabledelayedexpansion
set "FolderPath=C:\dir 1\dir2\dir3"
:DOWHILE
echo Checking contents of %FolderPath%
echo Doing some stuff
echo FolderPath before strip: %FolderPath%
for %%e in ("%FolderPath%") do set "ParentPath=%%~dpe"
echo ParentPath %ParentPath%
Set "FolderPath=%ParentPath:~0,-1%"
if NOT "%FolderPath%"=="%parentpath:~0,2%" echo FolderPath after strip: %FolderPath%&goto DOWHILE
GOTO :EOF
不需要
enabledelayedexpansion
,因为没有使用其值在 code block
(带括号的命令序列)内更改的变量的实例。
因此,每个
!var!
都可以是 %var%
。
首选语法是
set "var=value"
,它将确保行上的任何尾随空格不包含在分配的值中。根据需要插入所需的引号比操作它们更容易,因为它们是变量值的一部分。
我将
metavariable
从 %%X
更改为 %%e
,因为 adfnpstx
是元变量修饰符,因此如果将这些字符用作元变量,则拼写错误更难解决。
%%e
处理简单的带引号的字符串。由于路径包含空格,因此必须用引号引起该字符串。
parentpath
将以反斜杠终止(%%~p 产生终端反斜杠)所以 folderpath
就是这样,除了最后一个字符(来自提示的 Set/?
或许多文档中的示例)。
结果
folderpath
可能是 d:
,您显然不希望处理它。这是最终条件。
否则,
folderpath
将是目录名称。您需要添加终端反斜杠并将结果字符串括在引号中才能使用它,因为它可能包含空格,即 "%folderpath%\"
或 "%folderpath%\filemaskorfilename"
。
请注意,如果您确实想使用驱动器的根目录,请恢复
echo FolderPath after…
语句的原始位置。 d:\
表示“d:
的根目录”,而d:
表示“d:
的当前目录”