基本上,当我运行此脚本时,在do()部分中的runprog.exe返回(cmd提示符中的echos)everytihng之后。
@echo off set NODES=(server1.com server2.com) for %%i in %NODES% do ( echo Log stuff... >> logfile.txt runprog.exe /switch %%i if %ERRORLEVEL%==0 (echo success) else (echo fail) sleep 5 )
编辑:@echo off位于脚本的顶部。
答案 0 :(得分:1)
问题在于此sleep 5
命令:它是您拥有的自定义批处理文件。
有趣的是,如果我在计算机上运行批处理文件,就会发生同样的事情,而且我很可能会有一个不同的睡眠状态。批处理文件比你。我的包含以下内容:
@echo off
ping -n %1 127.0.0.1 > NUL 2>&1
用sleep 5
替换call sleep 5
可解决此问题。
我不知道为什么。问微软。
答案 1 :(得分:0)
正如Mike Nakis所说,这是批处理文件sleep
如果sleep.bat
包含@echo off
,则不重要。
问题是从另一个批处理文件启动批处理文件会将控件传输到新的批处理文件,但不会返回给调用者。
但是在你的情况下,你有一个FOR-loop
,它由cmd.exe完全缓存
这就是为什么第一批不会立即停止的原因
但是当第二个循环运行时,cmd.exe已离开batch-file-mode
,现在位于cmd-line-mode
。
您可以通过添加回显线来控制它。
@echo off
set "world=" -- unset the world variable
for /L %%n in (1 1 3) do @(
call echo Hello %%n %%world%%
sleep.bat 1
)
输出
1你好 2 Hello%world%
3 Hello%world%
这是因为当取消设置变量时,cmd-line-mode不会删除扩展百分比。
CALL sleep.bat
解决了问题,因为控件只是按预期返回到调用者。