【发布时间】:2016-10-26 07:46:28
【问题描述】:
碰巧有一个 BAT 文件在 Windows server 2008 上运行某个命令行工具,并将输出重定向到一个不断增长的日志,每次它超过一定大小时我都想旋转该日志。将该 BAT 文件更改为 CMD 将耗费时间和精力,更不用说 PowerShell PS1。所以我只能编辑那个 BAT 文件。
以下所有内容均在 Windows 7 和 2008 上进行测试。
尝试了以下方法:
for %%I in (Log.txt) do @echo %%~zI >> size.tmp
set /p logSIZE=<size.tmp
del size.tmp
if %logSIZE% GTR 100 (
echo OK
)
当时Log.txt 的测试是 157 字节,所以它回显了OK。然后我通过将 100 增加到 200 进行了否定测试,它没有回显OK。到目前为止一切顺利。
接下来我尝试将日期和时间戳连接到文件名中:
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set dateStamp=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set timeStamp=%%a%%b)
echo Log_%dateStamp%_%timeStamp%.txt
这也很有魅力。下一步是将两个脚本合并为一个:
for %%I in (Log.txt) do @echo %%~zI >> size.tmp
set /p logSIZE=<size.tmp
del size.tmp
if %logSIZE% GTR 100 (
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set dateStamp=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set timeStamp=%%a%%b)
echo %dateStamp%
echo %timeStamp%
rem move Log.txt "Log%dateStamp%_%timeStamp%.txt"
)
但这不再起作用,因为尽管脚本明显进入了if 块并使用当前日期/时间值执行set 命令,但环境变量仍然为空。 echo 命令不输出任何内容,新文件名仅包含 Log__.txt。
我尝试通过在文件开头添加以下行来调试它:
set dateStamp=A
set timeStamp=B
echo %dateStamp%
echo %timeStamp%
for %%I in (Log.txt) do @echo %%~zI >> size.tmp
set /p logSIZE=<size.tmp
del size.tmp
if %logSIZE% GTR 100 (
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set dateStamp=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set timeStamp=%%a%%b)
echo %dateStamp%
echo %timeStamp%
rem move Log.txt "Log%dateStamp%_%timeStamp%.txt"
)
工作正常,将 A 和 B 分配给变量,但随后这些值没有在 if 块内重新分配日期和时间戳。
我知道如何通过将环境变量分配保留在 if 块之外来解决这个问题:
for %%I in (Log.txt) do @echo %%~zI >> size.tmp
set /p logSIZE=<size.tmp
del size.tmp
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set dateStamp=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set timeStamp=%%a%%b)
if %logSIZE% GTR 100 (
echo Log_%dateStamp%_%timeStamp%.txt
)
但仍然想深入了解它,以防将来我必须在 if 块内分配变量。
我做错了什么?
【问题讨论】:
-
搜索 enabledelayedexpansion。您的变量在块的开头被它们的值替换。
-
很好的答案,但您不应该更改问题标题,因为在 BAT 文件中这样做对问题很重要。我不在乎,但未来的读者可能不会意识到它也解决了他们的问题。
-
这就是标签的用途;你用batch-file标记了你的问题,所以很清楚......
标签: batch-file environment-variables