ChatGPT解决这个技术问题 Extra ChatGPT

如何使用批处理脚本对目录中的每个文件执行某些操作

如何使用 .bat 或 .cmd 文件遍历目录中的每个文件?

为简单起见,请提供一个仅回显文件名或文件路径的答案。


y
yoel halb

命令行用法:

for /f %f in ('dir /b c:\') do echo %f

批处理文件使用:

for /f %%f in ('dir /b c:\') do echo %%f

更新:如果目录包含名称中带有空格的文件,则需要更改 for /f 命令使用的分隔符。例如,您可以使用管道字符。

for /f "delims=|" %%f in ('dir /b c:\') do echo %%f

更新 2:(比原始答案快一年半 :-))如果目录名称本身的名称中有空格,您可以使用 for 上的 usebackq 选项:

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files"`) do echo %%f

如果您需要使用输出重定向或命令管道,请使用转义字符 (^):

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files" ^| findstr /i microsoft`) do echo %%f

至少对于某些命令,文件变量应该用双引号引起来。
为什么在 for 之后需要 /f?根据帮助文档,/f 标志打开并读取每个文件。需要回显或重命名文件吗?
FOR 之后的 /f 将其限制为文件。同样,/d 限制为目录(文件夹),/r 指示它是递归的。
+1 这是一个活生生的答案,不断受到关注;非常感谢。
刚刚意识到您必须使用反引号...而不是 'dir /b "c:\program files"' 它应该是 `dir /b "c:\program files"`
P
Paul Houx

或者,使用:

forfiles /s /m *.png /c "cmd /c echo @path"

forfiles 命令在 Windows Vista 及更高版本中可用。


在第二个 cmd shell 中使用带空格的路径很困难。最后,我调整了 %PATH% 环境变量以完成工作。不过谢谢。有帮助
例如: forfiles /s /m *.bak /c "cmd /c 7za.exe a @path.7z @path"
为什么在这里调用另一个外部程序,cmd?我有 cmd 限制(但是,批处理文件正在工作,powershell 也在这里)。
C
Community

最简单的方法:

从命令行,使用:

for %f in (*.*) do echo %f

从批处理文件(加倍 % 百分号):

for %%f in (*.*) do echo %%f

从将文件夹指定为第一个参数的批处理文件中:

for %%f in (%1\*.*) do echo %%f

与使用 for 评估 dir /B 输出相比,不仅最简单,而且更加优雅。
在 %f 之前添加 /r 以递归子目录
为什么这不是公认的答案
m
mstrobl

利用

for /r path %%var in (*.*) do some_command %%var

和:

path 是起始路径。

%%var 是一些标识符。

*.* 是文件掩码或变量的内容。

some_command 是使用路径和 var 连接作为参数执行的命令。


我收到错误:%%var was unexpected at this time. 你能举一个确切的例子吗?我尝试了 for /r . %%var in (*.*) do echo %%var 的一系列变体
出于某种奇怪的原因,变量名被限制为一个字符。
我们可以为不同的结果使用不同的笑脸吗?
J
Juri Noga

另一种方式:

for %f in (*.mp4) do call ffmpeg -i "%~f" -vcodec copy -acodec copy "%~nf.avi"

“~nf”代表什么?
@JudgeDredd "%~nf" 代表不带扩展名的文件名,其中 ffor 部分中指定的变量的名称。文档:docs.microsoft.com/en-us/previous-versions/windows/it-pro/…
A
Anon

我有一些恶意软件将目录中的所有文件标记为隐藏/系统/只读。如果其他人发现自己处于这种情况,请 cd 进入目录并运行 for /f "delims=|" %f in ('forfiles') do attrib -s -h -r %f


请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更好,并且更有可能吸引赞成票。
如果他们不理解给定行的上下文,您的回答并不能很好地回答问题。无论如何您都不需要这样做,因为 ATTRIB 具有命令行标志来运行子目录并处理所有文件。 ATTRIB -S -H -R /S /D *.*(/S 处理子目录中的文件,/D 也处理文件夹)