Windows 批处理脚本在目录上递归循环,附加初始目录?
我有以下批处理脚本Windows 批处理脚本在目录上递归循环,附加初始目录?,windows,batch-file,Windows,Batch File,我有以下批处理脚本 for /D /r %%f in ( %~dp0 ) do echo %%f 据我所知,它应该在存储批处理脚本的目录中循环遍历所有目录,并打印完整的文件路径 但是,如果批处理脚本位于“C:\my\path”中,并且在它下面有文件夹“a”、“a\b”和“a\b\C”,我将得到以下输出 C:\my\path\a\C:\my\path C:\my\path\a\b\C:\my\path C:\my\path\a\b\c\C:\my\path 此脚本有什么问题?您似乎没有使用fo
for /D /r %%f in ( %~dp0 ) do echo %%f
据我所知,它应该在存储批处理脚本的目录中循环遍历所有目录,并打印完整的文件路径
但是,如果批处理脚本位于“C:\my\path”中,并且在它下面有文件夹“a”、“a\b”和“a\b\C”,我将得到以下输出
C:\my\path\a\C:\my\path
C:\my\path\a\b\C:\my\path
C:\my\path\a\b\c\C:\my\path
此脚本有什么问题?您似乎没有使用for命令:
for /D /r %~dp0 %%F in ( *.* ) do echo %%~F
/R
的语法为:
FOR /R [[drive:]path] %%parameter IN (set) DO command
请参见更改命令以使用当前目录
FOR /D /R %%a IN (*) DO ECHO=%%a
FOR /D /R "%~dp0" %%a IN (*) DO ECHO=%%a
因此,更改命令以使用脚本目录
FOR /D /R %%a IN (*) DO ECHO=%%a
FOR /D /R "%~dp0" %%a IN (*) DO ECHO=%%a
这是因为如果
中没有通配符(*
,?
),则的不会访问文件系统来解析括号之间的集合,因此字符串会按字面形式返回
尽管如此,访问文件系统当然是为了枚举/R
之后给出的目录树
在开关/R
之后为/R
提供的根路径,并在集合中使用全局通配符。要搜索目录而不是文件,请使用/D
开关:
for /D /R "%~dp0" %%F in ("*.*") do echo %%~F
不要忘记在路径项周围加引号,以避免出现空格和其他特殊字符的问题。for
变量的~
修饰符将在循环体中删除它们
或者,要返回纯目录列表而不进行任何筛选,可以使用set
,如下所示:
for /R "%~dp0" %%F in (.) do echo %%~F
输出可能如下所示:
for /R "%~dp0" %%F in (.) do echo %%~F
这是因为如果文件系统中没有通配符(*
,?
),则for
不会访问文件系统来解析括号之间的集合,因此字符串会按字面形式返回……这与他们正在进行目录搜索的事实没有任何关联@实际上,aschipfl指出的是OP问题中所示行为的原因,以及原始脚本有什么问题?
的答案for
命令执行两种不同类型的搜索:/r
从指定的或默认的起点枚举文件夹,但是带有通配符的set
子句将枚举匹配的文件。如果没有通配符,set
子句中的内容只是附加到/r
搜索的结果中。OP遇到了问题,因为他们希望在脚本位置目录中进行根目录搜索时,将%%dp0放在了错误的位置。(这在我之前的回答中被澄清)另外,关于/r开关等的信息在MrTux的另一个现有回答中被澄清。@Compo,MCND得到了我想要说的;解决方案(几乎)与其他答案相同,但没有一个解释为什么原始代码的行为与之类似;这就是我决定提供答案的原因;我认为没有理由投反对票;我将更新我的答案以澄清…您更新的for/D
答案仍然使用了我发布的内容的不必要的扩展版本,这是MrTux回复的略短更正版本。与/?
文档方法的内容匹配的非/D选项实际上会输出一个不需要的尾随空格和点。这只会给一个简单的问题增加困惑,这个问题已经被两位受访者充分回答了。