在 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
)
我的問題:時間是相同的對於所有批次持續時間(批次的時間)開始了當我期望每個循環中的實時時間時)。我已經指定了 setlocalenabledelayedexpansion ,這沒有幫助(所以我是否需要這個?)。
請注意,這並不能解決我的問題,因為我在每個循環中都需要時間。 NB2 我從視窗調度程式呼叫這個批次。
答案1
問題在於,在該行中(( )
區塊被解析為單行),所有%foo%
變數在運行循環之前僅計算一次for
。
enabledelayedexpansion
選項做幫助。但是,它不會改變常用%foo%
變數語法的解析規則。相反,它引入了一種新的—用作!
分隔符號。
for %%i in (*.nsf) do (
echo !date! !time!>> C:\backup\resuZip.log
)
但是,請務必小心,因為延遲擴展發生在%foo%
變數擴展之後。因此,如果%
變數中包含感嘆號,將會導致意外的輸出。 cmd.exe 解析規則有時會非常痛苦。
我強烈建議您為腳本使用不同的語言。考慮到 PowerShell 是最新 Windows 版本的一部分,並且它具有用於管理各種 Windows Server 元件的工具,它將是一個不錯的選擇。