Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批处理脚本在目录上递归循环,附加初始目录?_Windows_Batch File - Fatal编程技术网

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选项实际上会输出一个不需要的尾随空格和点。这只会给一个简单的问题增加困惑,这个问题已经被两位受访者充分回答了。