【问题标题】:Ping command works by itself but not in command filePing 命令单独工作,但不在命令文件中
【发布时间】:2019-07-22 18:20:41
【问题描述】:

这行代码是我之前在网上找到的,我已经用过很多次了。它按名称或地址 ping 给定服务器,并在输出中添加日期和时间戳,然后将其发送到文本文件。

如果我将它复制并粘贴到命令行中,它可以完美运行,但在命令文件 (.cmd) 中它不起作用。

我知道自己唯一要做的就是给变量双“%%”符号,我做到了。

这是我的代码:

CLS

@echo off

setlocal EnableDelayedExpansion

:start

    set /p server=Enter the server name you wish to run a continuous ping of:

    echo %server%

    if exist \\%server%\c$ goto ping
    echo THIS SERVER IS OFFLINE OR DOES NOT EXIST
    echo VERIFY NAME ENTERED AND TRY AGAIN
    pause

    goto start

:ping

    echo %server%

ping -t %server%|cmd /q /v /c "(pause&pause)>nul & for /l %%a in () do (set /p "data=" && echo(!date! !time! !data!)&ping -n 2 %server%>nul" >C:\%server%_ping.txt

:end

【问题讨论】:

  • 忽略“echo %server%”的东西,我添加它只是为了跟踪我在代码中的位置。它没用,与问题无关。
  • 另外,我确实得到了文本文件的输出,但它只是日期和时间戳。我没有在文本输出中显示 ping 结果。
  • 不确定,但我猜pause 命令可能会“吞下”生成的ping 文本...
  • 感谢您的建议。我删除了它,但它没有任何区别。
  • 无限 for /L 循环有什么用?

标签: batch-file for-loop ping


【解决方案1】:

您必须在批处理文件中禁用延迟变量扩展,因为管道的子外壳正在使用 cmd /v 指示的延迟扩展。

在批处理中启用延迟扩展会导致延迟变量在子 shell 开始执行之前得到解决。

您需要将setlocal EnableDelayedExpansion 更改为setlocal DisableDelayedExpansion

目前您的批处理文件本身不需要延迟变量扩展,但如果需要,它应该在执行管道命令之前禁用延迟扩展。

【讨论】:

  • 谢谢!完全有道理。谢谢你让我看到这个。应该多注意CMD的开关。现在可以了。认为这已解决。
  • 替代方案:将每个(引用)! 转义为 ^!,因此可以在托管批处理文件中启用延迟扩展...
猜你喜欢
  • 1970-01-01
  • 2013-05-28
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2014-09-30
  • 1970-01-01
相关资源
最近更新 更多