【问题标题】:Echoing output of command from variable从变量回显命令输出
【发布时间】:2014-10-07 13:27:34
【问题描述】:

我正在尝试创建一个简单的批处理脚本,它将命令的输出存储到 tmp 文件,将 tmp 文件的内容存储到变量,并输出变量:

@setlocal enableextensions enabledelayedexpansion
@echo off

ping -n 1 10.1.0.2 > tmp

SET @var= < tmp
ECHO %@var%

del tmp

我希望上面的方法可以工作,但它超出了:

C:\Documents and Settings\Administrator\Desktop>pinger.bat
ECHO is off.

(注:取@echo off 只输出ECHO is on,包括回显所有代码行)

【问题讨论】:

  • 设置 var 真的有必要吗?您可以只使用 type tmp 而不是设置和回显 var。
  • @rostok 是的,我需要在 var 中设置它,输出文件的内容不是我程序的目标。然后我需要对输出进行操作
  • 一次操作整个文件内容还是每行一行?
  • 我需要查看输出的第 7 行 Packets: Send = 1, Received = 1.... 并检查令牌,即确保 Received = 1。我的程序的最终目标是打印“Host is up”或“Host is down”
  • 请参阅stackoverflow.com/questions/21245545/…。要阅读第 7 行,请使用 for /f "skip=6 tokens=*" %%v in (tmp) do ( echo %%v \n goto end )

标签: windows batch-file


【解决方案1】:

@rostok(我的答案here)指出的question,显示了不使用接收到的数据包来确定主机是否在线的原因。在同一子网上,通过 ipv4,使用离线主机,您将收到“无法访问”错误,但会收到数据包。

对于 ipv4 中的简单测试,链接的答案可以解决您的问题。要对 ipv4 或 ipv6(显示不同的行为)进行更稳健的测试,this 可能会有所帮助。

不管怎样,直接从ping命令中获取所需数据的代码,

set "received="
for /f "skip=6 tokens=5 delims==, " %%a in ('ping -n 1 10.1.0.2') do (
    if not defined received set "received=%%a"
)

或从文件中

set "received="
for /f "usebackq skip=6 tokens=5 delims==, " %%a in ("tmpFile") do (
    if not defined received set "received=%%a"
)

其中skip子句表示应该跳过前六行,tokensdelims选择行内需要的元素

Packets: Send = 1, Received = 1,
        ^    ^^^ ^^        ^^^ ^  Delimiter position
1        2      3  4          5   Token number

但如前所述,这不是解决问题的可靠方法

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2012-02-15
    • 1970-01-01
    • 2016-05-21
    • 2022-10-24
    相关资源
    最近更新 更多