2014-04-27 5 views
5
@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 

Sto provando a farlo copiare tutti i file con "world_" come prefisso. Riconosce questo, ma mi imbatto in un problema quando provo ad avere più comandi nel ciclo. Puoi farlo con il comando FOR quindi presumo che l'utilizzo sia lo stesso. Qualcuno potrebbe darmi istruzioni su chi vorrei risolvere questo problema. Potrei eseguire il comando forfile 3 volte per ogni file, ma quello non può essere il modo corretto di farlo, vero?Come utilizzare più comandi in batch utilizzando il comando forfiles

risposta

4

I due comandi non hanno assolutamente nulla in comune, quindi no, non è possibile utilizzare le parentesi in questo modo.

È necessario eseguire tutti i comandi all'interno di un singolo CMD/C. È possibile concatenare i comandi su una riga utilizzando &. Ho definito una semplice "macro" XCOPY per risparmiare un po 'di digitazione.

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" 

Se sfuggire le virgolette, quindi è possibile utilizzare la continuazione linea per dividere la linea logica attraversato più righe. Ma poi devi anche sfuggire allo &.

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^" 

Oppure si potrebbe mettere il & nella parte anteriore della linea in modo che non c'è bisogno di sfuggire. La continuazione linea sfugge anche il primo carattere della riga successiva:

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

"Mondi copia:" errore: Argomento/Opzione non valida - '@file '. Digita "FORFILI /?" per l'uso. Interruttore non valido -/q "@file backup \ 2014-04-28D \ worlds \ @file" "Copia plug-in" Non sembra funzionare, ho provato il metodo prima di passare al metodo descritto dal ciclo For, entrambi sembrano non funzionare. – Brandon

+0

@MegaSniperB - Whoops - Ho parlato del necessario CMD/C nel mio testo, quindi ho dimenticato di usarlo nel mio codice. Dovrebbe essere risolto ora. – dbenham

1

Mi rendo conto che questo è un vecchio post, ma un altro modo di farlo è quello di chiamare un file batch e passarlo i parametri di cui ha bisogno. E non credo che ci siano limitazioni in ciò che può essere in quel file batch. Per esempio:

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