如何使用forfiles命令批量使用多个命令

时间:2014-04-27 02:31:12

标签: batch-file for-loop

@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命令执行此操作,因此我假设使用情况相同。有人可以给我指示我会解决这个问题。我可以为每个文件运行3次forfile命令,但这不是正确的做法吗?

2 个答案:

答案 0 :(得分:6)

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

您必须在单个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 :(得分:3)

我意识到这是一个旧帖子,但另一种方法是调用批处理文件并将其传递给它所需的参数。我不相信该批处理文件中的内容有任何限制。例如:

forfiles / M“* .img”/ C“cmd / c ProcessFile.bat @file @fate @ftime”