【问题标题】:How to do something to each file in a directory with a batch script如何使用批处理脚本对目录中的每个文件执行某些操作
【发布时间】:2010-09-15 21:29:47
【问题描述】:

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

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

【问题讨论】:

    标签: windows file loops batch-file 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 标志打开并读取每个文件。需要回显或重命名文件吗?
    • /fFOR 之后将其限制为文件。同样,/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"
    

    【讨论】:

    猜你喜欢
    • 2010-11-21
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多