【问题标题】:For statement echoing DO ( commands ) in console when batch script runs批处理脚本运行时在控制台中回显 DO ( commands ) 的语句
【发布时间】:2015-01-30 15:57:59
【问题描述】:

基本上,当我运行此脚本时,runprog.exe 在 do ( ) 部分返回(在 cmd 提示符中回显)之后。

@echo 关闭
设置节点=(server1.com server2.com)
对于 %NODES% 中的 %%i 执行 (
    echo 日志内容... >> logfile.txt
    runprog.exe /switch %%i
    if %ERRORLEVEL%==0(回显成功)否则(回显失败)
    睡觉 5
)

编辑:@echo off 位于脚本的顶部。

【问题讨论】:

  • 你试过@echo off吗?
  • @echo off 设置在顶部。
  • 也许你的Log stuff... 在某些时候计算为on,所以它被解释为echo on
  • @MikeNakis 你的“评估”是什么意思?我对此有一个想法。我试图在顶部的 do 语句中关闭 echo,并使用 atsign 来抑制 do 语句 ex 中的命令。签名回声。当我这样做时,它会为 do 语句中的每一行显示空白行。
  • 嗯,在 MS-DOS 批处理文件中,使用“扩展为”而不是“评估为”更正确。我的意思是,很明显,你的陈述并没有完全说echo Log stuff...,它说的是别的东西,你已经省略了,因为它可能无关紧要。但是,如果这恰好是文本 on,(或者如果它以某种方式被翻译成 on,)那么该语句将被解释为 echo on,从而打开回显。

标签: batch-file echo


【解决方案1】:

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

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

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

call sleep 5 替换sleep 5 可以解决这里的问题。

我不知道为什么。询问微软。

【讨论】:

  • 添加
    call sleep 5
    或评论不起作用。谢谢。
  • 好的,也许批处理文件包含@echo on。你检查了吗?
  • 我在顶部声明了@echo。我还尝试在 do() 的第一行重新声明它。
  • 抱歉,不,我的意思是sleep.bat
  • @LEEMAN 您还可以尝试将您的“睡眠”命令(无论它是否是批处理文件)替换为与我的 sleep.bat 具有相同内容的 sleep.bat 并调用它像我一样“打电话”。如果它对我有用,它也应该对你有用。
【解决方案2】:

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

这是因为 cmd-line-mode 在未设置变量时不会删除百分比扩展。

CALL sleep.bat 解决了问题,然后控制权按预期返回给调用者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2022-01-09
    • 2013-07-30
    • 1970-01-01
    相关资源
    最近更新 更多