【问题标题】:Batch perform action on all files in dir - wrong variable value?对目录中的所有文件批量执行操作 - 变量值错误?
【发布时间】:2016-04-12 00:52:31
【问题描述】:

我正在尝试使用 swftools 将 SWF 文件夹转换为图像。 实际的转换工作正常,但是我在尝试让它为文件夹中的所有文件运行时遇到问题。 (如果它也适用于所有子文件夹,那就太好了)。

假设文件夹包含以下文件:1.swf、2.swf、... 现在我为此编写的脚本是:

for %i in (*.swf) do (
set fileName=%i
swfrender "%fileName%" -o "%fileName:~0,-4%.png"
)

我是从包含 SWF 文件的文件夹中运行的。但是,我在命令提示符中看到以下内容,而不是预期的结果:

设置文件名=1.swf swfrender "3.swf" -o "3.png" )

设置文件名=2.swf swfrender "3.swf" -o "3.png" )

现在我发现脚本应该没问题,所以我不知道出了什么问题。

奇怪的是,以下似乎确实有效:

for /R %x in (*.swf) do swfrender %x -o %x.png

但我宁愿不必重命名几百个文件来删除文件名中多余的 .swf 部分。

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:

    您需要delayed expansion(在批处理文件中,您需要将循环标记加倍%):

    setlocal enableDelayedExpansion
    for %%i in (*.swf) do (
      set fileName=%%i
      swfrender "!fileName!" -o "!fileName:~0,-4!.png"
    )
    

    或者您可以提取不带扩展名的文件名:

    for %%i in (*.swf) do (
      swfrender "%%~i" -o "%%~ni.png"
    )
    

    【讨论】:

    • 两者似乎都导致:bla\swfFolder>for %%i in (*.swf) do ( %%i 在这个时候是出乎意料的。如果我用 %i 而不是 %% 尝试它尽管启用了延迟扩展,但它看起来像使用 !fileName! 而不是相关值。
    • @JoeDaenens - 如果你从命令行运行它,你需要使用单个%。如果它在批处理文件中,则需要加倍。
    • +1 用于避免在您的第二种方法中延迟扩展!但是,您不需要临时变量fileName
    • @aschipfl - 是的忘记删除行
    猜你喜欢
    • 2015-02-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多