如何使用forfiles命令在批处理中使用多个命令?

9
@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_”为前缀的文件。当我尝试在循环中使用多个命令时,遇到了问题。我已经尝试编写上面所需的批处理脚本。
2个回答

8

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

你必须在单个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^"

1
"复制世界:" 错误:无效的参数/选项 - '@file'。 键入“FORFILES /?”以获取用法。 无效的开关 - /q" @file backup\2014-04-28D\worlds@file" “复制插件” 这似乎不起作用,我在尝试了您的方法之后才去尝试For循环描述的方法,它们都似乎不起作用。 - Brandon
@MegaSniperB - 哎呀 - 我在我的文本中谈到了所需的CMD / C,然后忘记在我的代码中使用它。现在应该已经修复了。 - dbenham

6
我知道这是一篇旧文章,但还有另一种方法可以做到这一点,就是调用一个批处理文件并将所需的参数传递给它。我认为该批处理文件中可以包含任何内容,没有限制。例如:

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


假设您的初始批处理文件没有任何参数,您可以调用自身并使用“IF EXIST %1 GOTO LABEL”。 - Kelly Bang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接