forループでファイルに時間を書き込む

forループでファイルに時間を書き込む

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 コンポーネントを管理するためのツールを備えているため、適切な選択です。

関連情報