如何处理windows批处理变量?

时间:2015-12-15 06:24:35

标签: windows variables batch-file

我写过以下批次,但我担心它并没有接近我所期待的那样:

@echo off

set filename=%1
for /f "tokens=* USEBACKQ" %%F in (`forfiles /m "%filename%" /c "cmd /c echo @ftime"`) do (
set R1=%%F
)

:process
ping -n 60 127.0.0.1 > nul

for /f "tokens=* USEBACKQ" %%F in (`forfiles /m "%filename%" /c "cmd /c echo @ftime"`) do (
set R2=%%F
)

setlocal enabledelayedexpansion

if !R1! == !R2! (
   echo no change
) else (
   echo kill process
   set R1=!R2!
   echo !R1!
   taskkill /im schedule2.exe
   schedule2.exe
)

endlocal

goto process

此批次用于检查指定文件的修改时间(调用此批处理时文件名传递为参数),时间先记录,60秒后再次检查修改时间。如果文件被修改,则终止特定进程(在我的情况下称为schedule2.exe),然后重置最初获得的时间并更改为观察到的最新时间。因为使用enabledelayedexpansion,R1的值也不见了,我能做些什么才能达到我想要的效果呢?非常感谢

1 个答案:

答案 0 :(得分:1)

删除selocal/endlocal括号。该括号内没有任何内容需要delayedexpansion

您还需要将!var!更改为%var%,因为delayedexpansion之后不会被调用。

您的问题是您在子例程中煽动r1,但由于目前在setlocal/endlocal括号范围内,因此在遇到endlocal时会撤消更改。