将基于特定大小的日志旋转到带日期/时间戳的副本

时间:2016-06-23 19:56:18

标签: batch-file environment-variables

恰好有一个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块中分配变量。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

发布此问题,因此这个问题至少有一个其他人可以很快抓住的答案,因为我没有在评论中看到实际的答案。 @ths应该重新发布以接收积分。

正如@ths在问题注释中指出的那样,脚本在开始时需要setlocal EnableDelayedExpansion才能纠正此行为。

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