我正在尝试找出一种方法来对多个文件夹中的多个文件执行命令。据我所知,循环for
是在 CMD 中执行此操作的最佳方法(我使用的是 Windows)。但我遇到了一些问题,我将使用我需要执行的操作之一作为示例。
对于此特定命令,我尝试在多个文件夹中为多个文件创建文件夹。以下是视觉效果:
Folder A
File 1.avi
File 2.avi
Folder B
File 3.avi
File 4.avi
我进行了一些搜索,然后想出了这个命令:
for /f "delims=*" %a in ('dir *.avi /b /s') do md "%~na"
这是我收集的这里。这几乎是正确的——它为多个文件夹内的每个文件创建一个文件夹。问题是,我需要这些新文件夹包含在与文件相同的文件夹中。此特定命令会将新文件夹放在原始文件夹的位置,而不是放在原始文件夹内。
有人有什么想法吗?任何帮助都将不胜感激。谢谢。
答案1
标准调试技术是将
echo
命令插入脚本甚至复合/复杂命令中。如果你这样做for /f "delims=*" %a in ('dir *.avi /b /s') do @echo md "%~na"
你会得到输出
"file 1" "file 2" "file 3" "file 4"
笔记:
- 这
@
阻止echo
命令他们自己显示,因此您只能看到它们的输出。 "delims=…"
告诉for
如何解析命令的输出行dir *.avi /b /s
。我不知道您链接到的答案为什么建议"delims=*"
。但默认行为是在空格处分行,因此,如果您的目录和/或文件名包含空格(如您所指出的),则应使用"delims="
(指定没有分隔符)来使其工作。
- 这
如果你输入
for /?
或help for
,你将获得有关该命令的文档for
。在第五页,你会看到In addition, substitution of FOR variable references has been enhanced. You can now use the following optional syntax: %~I - expands %I removing any surrounding quotes (") ︙ %~pI - expands %I to a path only %~nI - expands %I to a file name only ︙ The modifiers can be combined to get compound results … ︙
这解释了为什么
%~na
只获取*.avi
全名在 中的文件的文件名%a
。现在尝试for /f "delims=" %a in ('dir *.avi /b /s') do @echo md "%~pa"
你会得到
“当前目录\文件夹 A\” “当前目录\文件夹 A\” “当前目录\文件夹 B\” “当前目录\文件夹 B\”
由此我们可以得出结论,你想做
for /f "delims=" %a in ('dir *.avi /b /s') do md "%~pa%~na"
在 下创建
file 1
和file 2
目录Folder A
,在 下创建file 3
和目录。并且,正如@dave_thompson_085 指出的那样,您可以将 合并到 中。file 4
Folder B
%~pa%~na
%~pna