In Windows 2008: Ich versuche, Dateien zu komprimieren und auf einen Backup-Server zu kopieren. Ich verwende die Befehlszeile/Batchdatei, ich protokolliere das Ergebnis in einer Protokolldatei, ich möchte jetzt auch die Zeit fürjedeDatei wird geloopt.
Die Batchdatei backupZipCopy.bat:
setlocal enabledelayedexpansion
echo starting at %date% %time%>>c:\backup\resuZip.log
d:
cd \myDirectoryToBackup
FOR %%i IN (*.nsf) DO (
echo %date% %time%>>c:\backup\resuZip.log
"C:\Program Files\7-Zip\7z.exe" -bd u "\\backupServer\myBackup\%%~ni.zip" "%%~fi">>c:\backup\resuZip.log
)
Mein Problem:Die Zeit ist dieDasselbefür die gesamte Batch-Dauer (die Zeit, in der Batchgestartetals ich die Echtzeit in jeder Schleife erwartet habe). Ich habe bereits „setlocal enabledelayedexpansion“ angegeben, was nicht hilft (brauche ich das also oder nicht?).
NB: timethis wird mein Problem nicht lösen, da ich in jeder Schleife Zeit brauche. NB2: Ich rufe diesen Batch vom Fensterplaner aus auf.
Antwort1
Das Problem besteht darin, dass in der Zeile (der ( )
Block wird als einzelne Zeile analysiert) alle %foo%
Variablen nur einmal ausgewertet werden, bevor die for
Schleife ausgeführt wird.
Die enabledelayedexpansion
OptiontutHilfe. Es ändert jedoch nicht die Parsing-Regeln für die übliche %foo%
Variablensyntax. Stattdessen führt es eine neue ein – die Verwendung von !
als Trennzeichen.
for %%i in (*.nsf) do (
echo !date! !time!>> C:\backup\resuZip.log
)
Seien Sie dabei jedoch sehr vorsichtig, da die verzögerte Erweiterung erst erfolgt, nachdem die Variablen erweitert wurden. Wenn eine Variable Ausrufezeichen enthält, %foo%
führt dies daher zu einer unerwarteten Ausgabe . Die Analyseregeln von cmd.exe sind manchmal geradezu schmerzhaft.%
Ich empfehle Ihnen dringend, für Ihr Skript eine andere Sprache zu verwenden. PowerShell wäre eine gute Wahl, da es Teil der meisten aktuellen Windows-Versionen ist und über Tools zur Verwaltung verschiedener Windows Server-Komponenten verfügt.