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块内分配变量。
我究竟做错了什么?
发布这个,所以这个问题至少有一个其他人可以很快抓住的答案,因为我在评论中没有看到实际的答案。@ths 应该重新发布才能获得积分。
正如@ths 在问题评论中指出的那样,脚本需要setlocal EnableDelayedExpansion从一开始就纠正行为。
您可以从同一主题的上一个问题中了解更多相关信息。
Windows 批处理 SET 内部 IF 不起作用
| 归档时间: |
|
| 查看次数: |
787 次 |
| 最近记录: |