【问题标题】:Windows Batch Files: copy sequential filesWindows 批处理文件:复制顺序文件
【发布时间】:2014-08-24 16:04:06
【问题描述】:

简短的前言:我是一名艺术家,对编程的了解很少,几个小时前我才开始学习 windows 批处理文件。

所以,在我的学校,当我们在 Maya 中渲染文件时,我们必须在本地驱动器上进行,并且我们使用多台计算机来加速这个过程。 这会在多台计算机上创建数百个图像。 我的计划是创建一个批处理文件,通过网络将图像(完成后)复制到单个驱动器,以便更轻松地管理渲染图像。

我正在使用 for 循环遍历文件名(在本例中为 BallTest_xxxx.exr),我可以很好地打印出文件名;但是,当我尝试将文件名设置为循环中的变量时,它最终什么也没有打印出来。

我有“echo.%asdf%”的地方,我希望它是它读取文件的地方,并从那里检查渲染是否完成(我对后者有一些想法,但现在,我只是想了解我需要做什么才能使第一部分工作。) 我可以在结果中看到,当我尝试将 asdf 设置为文件名时,它给了我 BallTest_000%x.exr,我知道这是不对的。

set "filename=BallTest_"
set "extension=.exr"

for /l %%x in (1, 1, 3) do (
    if %%x lss 10 (
        set asdf=%filename%000%%x%extension%
        echo.%filename%000%%x%extension%
        echo.%asdf%
    )
)

pause

提前致谢,

乔治

【问题讨论】:

  • 您是否尝试过set asdf=%filename%"000"%%x%extension%

标签: batch-file windows-7 sequential


【解决方案1】:

也许这就是你要找的东西:

@echo off
set "filename=BallTest_"
set "extension=.exr"
setlocal enableDelayedExpansion
for /l %%x in (1, 1, 3) do (
    if %%x lss 10 (
        set asdf=%filename%000%%x%extension%
        echo.%filename%000%%x%extension%
        echo.!asdf!
    )
)
endlocal
pause

延迟扩展对于批处理文件的新手来说是一件令人困惑的事情。 更多信息你可以找到herehere

【讨论】:

  • 嘿,感谢您回复我。在您回答之前看到评论后,我坐下来试图弄清楚。我最终发现了如何使它工作,事实证明这正是你所建议的。我敢肯定,我如何将整个事情组合在一起并不是最干净或最佳的方式(处理最多 4 位的帧填充最终看起来又丑又笨重),但它现在可以工作了,而且我的渲染直接到正确的驱动器。
【解决方案2】:

这建立在 npocmaka 的回答之上:

REM 行只是批处理文件 cmets,包括在内以帮助理解。随意在您的最终代码中删除它们。

@echo off

REM Set the part of the filename before the number padded with zeroes
set "filename=DocumentPrefix"

REM Set the remaining part of the filename after the number padded with zeroes
set "extension=Suffix.txt"

REM Enable delayed expansion so variables are expanded at execution time rather than parse time
setlocal enableDelayedExpansion

REM Give the variable %%x a range of values
for /l %%x in (2, 1, 4) do (

    REM Pad the current number with zeros (lots used here to account for possible numbers reaching high orders)
    set "paddedNumber=00000000%%x"

    REM Extract the padded number with the desired number of digits
    set "paddedNumber=!paddedNumber:~-6!

    REM Tell the user what file is being copied (or moved)
    echo Copying %filename%!paddedNumber!%extension%

    REM Replace "copy" with "move" to move files rather than copy
    REM Replace the source and destination addresses with your own
    copy "C:\Path\To\Source\Folder\%filename%!paddedNumber!%extension%" "C:\Path\To\Destination\Folder\"
    )
)

endlocal

REM Pause the script at the end so the user can see that the batch file has stopped (and hopefully completed correctly)
pause

如果您想移动文件而不是复制,只需将copy(在 for 循环的末尾更改为 move

要仅复制选定的文件,请根据需要更改 for 循环中的三个数字。 for 循环编号对应于(第一个数字、间隔、最后一个数字)。例如,对于像00030004 这样的填充顺序文件,要从文件夹中将文件6 复制到15,请将for 循环编号更改为(6,1,15)。如果您只想复制/移动每个第 n 个文件,请指定 (1,n,x),其中 n 是间隔(例如,每三个文件为 3),x 是您要复制的最后一个文件的编号(理想情况下是应该是n 的倍数加上 1)。

我将paddedNumber 设置为有八个零。除非您的文件夹有超过 1 亿个文件,否则您无需调整此行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多