批处理文件 – 将基于特定大小的日志旋转到日期/时间戳副本

参见英文答案 >
Variables are not behaving as expected                                    1个

碰巧有一个BAT文件在Windows服务器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块中分配变量.

我究竟做错了什么?

最佳答案 发布这个,所以这个问题至少得到了其他人可以迅速抓住的答案,因为我没有在评论中看到实际答案. @ths应该重新发送信用卡.

正如@ths在问题的评论中指出的那样,脚本在开始时需要setlocal EnableDelayedExpansion来纠正行为.

您可以从上一个关于同一主题的问题中了解更多相关信息.
windows batch SET inside IF not working

点赞