在 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 我从窗口调度程序调用此批处理。
答案1
问题在于,在行中(该( )
块被解析为单行),%foo%
在运行循环之前,所有变量仅被评估一次for
。
选项enabledelayedexpansion
做帮助。但是,它不会改变通常变量语法的解析规则%foo%
。相反,它引入了一个新的规则——使用!
作为分隔符。
for %%i in (*.nsf) do (
echo !date! !time!>> C:\backup\resuZip.log
)
但是,要非常小心,因为延迟扩展发生在%foo%
变量扩展之后。因此,如果%
变量中有感叹号,将导致意外的输出。cmd.exe 解析规则有时非常痛苦。
我强烈建议您使用其他语言编写脚本。考虑到 PowerShell 是最新 Windows 版本的一部分,并且具有管理各种 Windows Server 组件的工具,因此它是个不错的选择。