【问题标题】:How to use multiple commands in batch using forfiles command?如何使用 forfiles 命令批量使用多个命令?
【发布时间】:2014-04-27 02:31:11
【问题描述】:
@ECHO OFF

SET backdir=backup
SET snapshotdir=snapshots
SET worldprefix=world_
SET itdate=%date:~10,4%-%date:~4,2%-%date:~7,2%
SET hour=%time:~0,2%

IF "%hour:~0,1%" == " " SET hour=0%hour:~1,1%

echo Current date: %itdate%. Current hour: %hour%. Current Minute:Second: %time:~3,2%:%time:~6,2%

    forfiles /m "%worldprefix%*" /c (
        echo Copying World: @path
        cmd /c xcopy /e /c /h /i /v /r /y /q @file %snapshotdir%\@file\%itdate%-%hour%-%time:~3,2%-%time:~6,2%
        cmd /c xcopy /e /c /h /i /v /r /y /q @file %backdir%\%itdate%D\worlds\@file
     )

echo Copying Plugins
xcopy /e /c /h /i /v /r /y /q plugins %backdir%\%itdate%D\plugins\
xcopy /e /c /h /i /v /r /y /q %backdir%\%itdate%D %backdir%\%itdate%-%hour%H\

echo Backup Complete (assuming no errors above).  Attempting to remove old files..
forfiles /p "%snapshotdir%" /c "cmd /c rmdir /s /q @path" /d -7
forfiles /p "%backdir%" /m "*H" /c "cmd /c rmdir /s /q @path" /d -2
forfiles /p "%backdir%" /m "*D" /c "cmd /c rmdir /s /q @path" /d -14

PAUSE

我正在尝试复制所有以“world_”为前缀的文件。当我尝试在循环中使用多个命令时遇到问题。我已经尝试在上面编写我想要的批处理脚本。

【问题讨论】:

    标签: for-loop batch-file forfiles


    【解决方案1】:

    这两个命令完全没有共同点,所以不,你不能这样使用括号。

    您必须在单个 CMD /C 中执行所有命令。您可以使用& 在一行上连接命令。我已经定义了一个简单的 XCOPY“宏”来节省一些输入。

    set XCOPY=xcopy /e /c /h /i /v /r /y /q"
    forfiles /m "%worldprefix%*" /c "cmd /c echo Copying World: @path&%XCOPY% @file %snapshotdir%\@file\%itdate%-%hour%-%time:~3,2%-%time:~6,2%&%XCOPY% @file %backdir%\%itdate%D\worlds\@file"
    

    如果您对引号进行转义,则可以使用续行将逻辑行拆分为多行。但是你还必须转义&

    set XCOPY=xcopy /e /c /h /i /v /r /y /q"
    forfiles /m "%worldprefix%*" /c ^"cmd /c ^
    echo Copying World: @path ^&^
    %XCOPY% @file %snapshotdir%\@file\%itdate%-%hour%-%time:~3,2%-%time:~6,2% ^&^
    %XCOPY% @file %backdir%\%itdate%D\worlds\@file^"
    

    或者您可以将& 放在该行的前面,这样您就不需要转义它。续行也会转义下一行的第一个字符:

    set XCOPY=xcopy /e /c /h /i /v /r /y /q"
    forfiles /m "%worldprefix%*" /c ^"cmd /c ^
    echo Copying World: @path^
    &%XCOPY% @file %snapshotdir%\@file\%itdate%-%hour%-%time:~3,2%-%time:~6,2%^
    &%XCOPY% @file %backdir%\%itdate%D\worlds\@file^"
    

    【讨论】:

    • “复制世界:”错误:无效的参数/选项 - '@file'。输入“FORFILES /?”供使用。无效开关 - /q" @file backup\2014-04-28D\worlds\@file" "Copying Plugins" 这似乎不起作用,我在转到 For 循环描述的方法之前尝试了你的方法,它们似乎不工作。
    • @MegaSniperB - 哎呀 - 我在我的文本中谈到了所需的 CMD /C,然后忘记在我的代码中使用它。现在应该修好了。
    【解决方案2】:

    我意识到这是一篇旧文章,但另一种方法是调用批处理文件并将所需的参数传递给它。而且我认为该批处理文件中的内容没有任何限制。例如:

    forfiles /M "*.img" /C "cmd /c ProcessFile.bat @file @fdate @ftime"

    【讨论】:

    • 假设您的初始批处理文件没有任何参数,您可以调用自身并使用“IF EXIST %1 GOTO LABEL”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2013-09-02
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多