Batch file 用于在批处理脚本运行时在控制台中回显DO(命令)的语句

Batch file 用于在批处理脚本运行时在控制台中回显DO(命令)的语句,batch-file,echo,Batch File,Echo,基本上,当我运行这个脚本时,runprog.exe每次在do()部分返回(cmd提示符中的echos) @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) slee

基本上,当我运行这个脚本时,runprog.exe每次在do()部分返回(cmd提示符中的echos)

@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 ) @回音 设置节点=(server1.com server2.com) 对于%%i in%NODES%do( echo日志内容…>>logfile.txt runprog.exe/switch%%i 如果%ERRORLEVEL%==0(回显成功)或其他(回显失败) 睡眠5 )
编辑:@echo off位于脚本顶部

问题出在这个
sleep 5
命令中:这是一个自定义批处理文件

有趣的是,如果我在我的计算机上运行你的批处理文件,同样的事情也会发生,我很可能有一个与你不同的“睡眠”批处理文件。地雷包括以下内容:

@echo off
ping -n %1 127.0.0.1 > NUL 2>&1
sleep 5
替换为
call sleep 5
可以解决此问题


我不知道为什么。询问Microsoft。

正如Mike Nakis所说,这是批处理文件
sleep

sleep.bat
是否包含
@echo off
并不重要

问题是,从另一个批处理文件启动批处理文件会将控件转移到新的批处理文件,但不会返回给调用者

但是在您的例子中,有一个
FOR循环
,它被cmd.exe完全缓存。
这就是为什么第一批没有立即停止的原因。
但是当第二个循环运行时,cmd.exe已离开批处理文件模式,现在处于
cmd行模式

您可以通过添加回音线来控制这一点

@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你好%world%
3你好%world%

这是因为当变量未设置时,cmd行模式不会删除百分比扩展


调用sleep.bat
解决了这个问题,因为控制会像预期的那样简单地返回给调用者。

您是否尝试过
@echo off
?@echo off设置在顶部。也许您的
日志内容…
在某个时候计算为
on
,因此,它被解释为
echo on
@MikeNakis“evaluates”到on是什么意思?关于那件事我有个主意。。我试图在顶部的do语句中禁用echo,并在atsign中禁用do语句中的命令,例如atsign echo。当我这样做时,do语句中的每一行都显示了空行。在MS-DOS批处理文件中,使用“扩展到”来代替“计算为”更为正确。我的意思是,很明显,你的声明并没有确切地说,
echo-Log-stuff…
,而是说了一些其他的东西,你忽略了这些东西,因为它们可能是不相关的。但是,如果这是上的文本
,(或者如果它是以某种方式被翻译为
上的
,),则该语句将被解释为
上的
echo,从而打开echo。添加调用睡眠5或注释不起作用。谢谢。好的,批处理文件可能包含
@echo on
。你检查过了吗?我在顶部声明“echo off”。我还试图在do()的顶行重新声明它。对不起,不,我的意思是
sleep.bat
@LEEMAN您还可以尝试用一个与我的sleep.bat内容相同的sleep.bat替换您的'sleep'命令(无论它是否是批处理文件),并像我一样用'call'调用它。如果它对我有效,它也应该对你有效。