在 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,但这没有帮助(所以我是否需要这个?)。

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 组件的工具,因此它是个不错的选择。

相关内容