参见英文答案 >
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