Windows 2008: ファイルを圧縮してバックアップサーバーにコピーしようとしています。コマンドライン/バッチファイルを使用して、結果をログファイルに記録します。今度は、時間も記録したいと思います。それぞれファイルがループしました。
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
)
私の問題:時間は同じバッチ期間全体(バッチが開始各ループで実際の時間を期待したとき)。すでに setlocal enabledelayedexpansion を指定していますが、役に立ちません (これは必要なのでしょうか、それとも不要なのでしょうか)。
注意: 各ループで時間が必要なので、timethis では問題は解決しません。注意: このバッチはウィンドウ スケジューラから呼び出しています。
答え1
問題は、行(( )
ブロックは 1 行として解析されます)で、ループ%foo%
を実行する前にすべての変数が 1 回だけ評価されることですfor
。
オプションenabledelayedexpansion
するヘルプ。ただし、通常の変数構文の解析ルールは変更されません%foo%
。代わりに、区切り文字として使用する新しいルールが導入されます!
。
for %%i in (*.nsf) do (
echo !date! !time!>> C:\backup\resuZip.log
)
ただし、遅延展開は%foo%
変数が展開された後に行われるため、これには十分注意してください。したがって、変数に感嘆符が含まれていると、予期しない出力が発生します%
。cmd.exe の解析ルールは、時々非常に厄介です。
スクリプトには別の言語を使用することを強くお勧めします。PowerShell は最新の Windows リリースの一部であり、さまざまな Windows Server コンポーネントを管理するためのツールを備えているため、適切な選択です。