【问题标题】:Rotating a log based on certain size into a date/time-stamped copy [duplicate]将基于特定大小的日志旋转为带有日期/时间戳的副本[重复]
【发布时间】: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


【解决方案1】:

发布这个,所以这个问题至少有一个其他人可以快速捕捉到的答案,因为我没有在 cmets 中看到实际答案。 @ths 应该重新发布以获得信用。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-18
    • 2014-06-26
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    相关资源
    最近更新 更多