用于循环向上导航目录路径的批处理脚本

问题描述 投票:0回答:1

我有一些目录路径,比如“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 . . .

我唯一注意到的是我的初始路径上缺少 \ 。 我对批处理脚本非常陌生,所以很明显我花了几个小时错过了一些事情。

windows loops batch-file cmd path
1个回答
0
投票
@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:
的当前目录”

© www.soinside.com 2019 - 2024. All rights reserved.