将基于特定大小的日志轮换为带日期/时间戳的副本

aje*_*jeh 5 batch-file environment-variables

碰巧的是,有一个BAT文件在Windows Server 2008上运行某个命令行工具,并将输出重定向到一个不断增长的日志,我想在每次日志增长到一定大小时都将其旋转。毫无疑问,将BAT文件更改为CMD会很耗时间和精力。因此,我不得不编辑该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
)
Run Code Online (Sandbox Code Playgroud)

当时的测试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
Run Code Online (Sandbox Code Playgroud)

这也像一种魅力。下一步是将两个脚本合并为一个:

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"
)
Run Code Online (Sandbox Code Playgroud)

但这不再起作用,尽管脚本明显进入了该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"
)
Run Code Online (Sandbox Code Playgroud)

可以正常工作,将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
)
Run Code Online (Sandbox Code Playgroud)

但仍然想深入了解它,以防万一将来我不得不在一个if块内分配变量。

我究竟做错了什么?

Joh*_*n C 1

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

正如@ths 在问题评论中指出的那样,脚本需要setlocal EnableDelayedExpansion从一开始就纠正行为。

您可以从同一主题的上一个问题中了解更多相关信息。
Windows 批处理 SET 内部 IF 不起作用