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


0

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を指定していますが、これは役に立ちません(だから、これが必要かどうか)。

NB timethisは、各ループに時間が必要なので、私の問題を解決しません。NB2このスケジューラをウィンドウスケジューラから呼び出しています。

回答:


3

問題は、その行(( )ブロックが1行として解析される)で%foo%forループを実行する前にすべての変数が1回だけ評価されることです。

このenabledelayedexpansionオプション役立ちます。ただし、通常の%foo%変数構文の解析規則は変更されません。代わりに、新しいものを導入します- !区切り文字として使用します。

for %%i in (*.nsf) do (
    echo !date! !time!>> C:\backup\resuZip.log
)

ただし、%foo%変数の展開後に遅延展開が発生するため、これには十分注意してください。したがって、%変数に感嘆符が含まれていると、予期しない出力が発生します。cmd.exeの解析ルールは、時には痛烈です。

スクリプトには別の言語を使用することを強くお勧めします。PowerShellは、最新のWindowsリリースの一部であり、さまざまなWindows Serverコンポーネントを管理するためのツールを備えていることを考えると、良い選択でしょう。


1
うん、強くお勧め:cmd.exe以外の何か ...ホラー..ホラー。
アキラ14

私はあなたのポイントを@akiraを得ますが、より良い簡単な方法をアドバイスできますか?
エマニュエルグライザー14

@EmmanuelGleizer:python、ruby、powershell?$ reasonsを使用する必要がある場合を除き、cmd.exeではなく..を選択します。
アキラ14

@EmmanuelGleizer:PowerShellは学習に非常に役立ちます。最近のWindowsの一部であり、多くの Windows Serverコンポーネントを管理するためのコマンドレットもあります。(Windowsを自分で扱うことはめったにないので、Pythonを
使い

どうもありがとう!あなたは私の問題を解決します。これを書き直す必要があることに注意してください!私はこれをパワーシェルで書き直すと思います... stackoverflow.com/questions/18847145/…が私の出発点です。もう一度感謝します!
エマニュエルグライザー14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.