首页 文章

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

提问于
浏览
1

基本上,当我运行此脚本时,在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位于脚本的顶部 .

2 回答

  • 0

    正如Mike Nakis所说,这是批处理文件 sleep .
    如果 sleep.bat 包含 @echo off 则不重要 .

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

    但在你的情况下,你有一个 FOR-loop ,由cmd.exe完全缓存 .
    那's the cause why the first batch doesn' t立即停止 .
    但是当第二个循环运行时,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 Hello 2 Hello%world%3 Hello%world%

    这是因为当取消设置变量时,cmd-line-mode不会删除扩展百分比 .

    CALL sleep.bat 解决了问题,因为控件只是按预期返回到调用者 .

  • 1

    问题出在这个 sleep 5 命令中:它是您拥有的自定义批处理文件 .

    有趣的是,如果我在我的计算机上运行批处理文件,则会发生完全相同的事情,而且我很可能有一个与您不同的“睡眠”批处理文件 . 我的包含以下内容:

    @echo off
    ping -n %1 127.0.0.1 > NUL 2>&1
    

    call sleep 5 替换 sleep 5 解决了这里的问题 .

    我不知道为什么 . 问问微软 .

相关问题