2015-12-15 197 views
0

我写了下面的批次,但恐怕它不工作接近我很期待:如何处理windows批处理变量?

@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的值也会消失,那么我能做些什么来实现我想要的结果呢?非常感谢

+0

将'setlocal enabledelayedexpansion'移到脚本的顶部,直接在'@echo off'下面。 – SomethingDark

+0

在这种情况下,文件名的值也消失了,但它应该保持全局​​并永远持续 –

+1

请遵循@ SomethingDark的建议**和**删除'endlocal'。 – JosefZ

回答

1

删除selocal/endlocal支架。该支架中没有任何内容需要delayedexpansion

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

您的问题是,你是在子程序中stiing r1,但因为这是目前setlocal/endlocal支架内,该变化被回退遇到endlocal时。

+0

他在'for'循环中设置了'R1'和'R2';他会不会需要延迟扩展才能打电话给他们呢? – SomethingDark

+2

@SomethingDark:呃,不。那么'if'语句中的显示应该是'r2',但似乎试图显示正在被'endlocal'回退的'r1'的改变值。删除'setlocal'和'endlocal'(最好在'@echo off'之后直接移动'setlocal')将在前导码中设置'r1',然后循环重复[潜在改变 - 'r2'。如果改变了,请做好你的工作,并将'r1'设置为新值。]不需要'delayedexpansion'。如果时间包含空格(idk robocopy的格式),另一个mod可能会将'if'更改为'if'%r1%“==”%r2%“' – Magoo