如何使用批处理脚本对目录中的每个文件执行某些操作
Posted
技术标签:
【中文标题】如何使用批处理脚本对目录中的每个文件执行某些操作【英文标题】:How to do something to each file in a directory with a batch script 【发布时间】:2010-09-15 21:29:47 【问题描述】:如何使用 .bat 或 .cmd 文件遍历目录中的每个文件?
为简单起见,请提供一个仅回显文件名或文件路径的答案。
【问题讨论】:
【参考方案1】:命令行用法:
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:(比原来的答案快一年半了 :-))如果目录名称本身的名称中有空格,则可以使用 usebackq
选项for
:
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
【讨论】:
至少对于某些命令,文件变量应该用双引号括起来。 为什么/f
需要在for
之后?根据帮助文档,/f
标志打开并读取每个文件。需要回显或重命名文件吗?
/f
在FOR
之后将其限制为文件。同样,/d
限制为目录(文件夹),/r
指示它是递归的。
+1 这是一个活生生的答案,不断受到关注;非常感谢。
刚刚意识到你必须使用反引号......而不是'dir /b "c:\program files"'
,它应该是`dir /b "c:\program files"`
【参考方案2】:
使用
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
的一系列变体
由于某种奇怪的原因,变量名被限制为一个字符。
我们可以为不同的结果使用不同的笑脸吗?【参考方案3】:
或者,使用:
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"【参考方案4】:我有一些恶意软件将目录中的所有文件标记为隐藏/系统/只读。如果其他人发现自己处于这种情况,请 cd 进入目录并运行 for /f "delims=|" %f in ('forfiles') do attrib -s -h -r %f
。
【讨论】:
请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。 如果他们不理解给定行的上下文,您的回答并不能很好地回答问题。无论如何,您都不需要这样做,因为 ATTRIB 具有命令行标志来运行子目录并处理所有文件。ATTRIB -S -H -R /S /D *.*
(/S 处理子目录中的文件,/D 也处理文件夹)【参考方案5】:
最简单的方法:
从命令行,使用:
for %f in (*.*) do echo %f
来自批处理文件(将 % 百分号加倍):
for %%f in (*.*) do echo %%f
从一个将文件夹指定为第一个参数的批处理文件:
for %%f in (%1\*.*) do echo %%f
【讨论】:
与使用for
评估dir /B
输出相比,不仅最简单,而且更加优雅。
在 %f 之前添加 /r 以递归子目录【参考方案6】:
另一种方式:
for %f in (*.mp4) do call ffmpeg -i "%~f" -vcodec copy -acodec copy "%~nf.avi"
【讨论】:
“~nf”代表什么? @JudgeDredd"%~nf"
代表不带扩展名的文件名,其中f
是for
部分中指定的变量的名称。文档:docs.microsoft.com/en-us/previous-versions/windows/it-pro/…以上是关于如何使用批处理脚本对目录中的每个文件执行某些操作的主要内容,如果未能解决你的问题,请参考以下文章