0

这是我的批次的一部分...

for /f "delims=" %%i in ('C:\pathto\dig.exe www.example.com @8.8.8.8 +short') do set RIP=%%i
If %RIP%==93.184.216.119 (
  ECHO - PASS >> results-file.txt
) else (
  ECHO - FAIL >> results-file.txt
)

...这工作正常 - 除了,假设 DNS 服务器 8.8.8.8 不可用或损坏(因此为了测试用错误的 IP 替换它),然后,通常从命令行 dig.exe 将超时并最终返回。 ..

;; connection timed out; no servers could be reached

...然后返回到命令提示符。所以我希望该字符串在 %RIP% 中设置,因此 FAIL 将被打印到文件中,但是发生的情况是 dig.exe 运行、超时,然后 cmd.exe 刚刚关闭,并且没有任何内容写入文件,并且该批次的其余部分不会继续。

知道我哪里出错了吗?

4

1 回答 1

1

未设置 RIP 变量至少有一个原因 - 默认 FOR /F EOL 值为分号,这意味着所有以开头的行都将;被忽略。您需要将 EOL 设置为您知道该行不能以该行开头的内容,或完全禁用它(棘手)。

也有可能将错误信息发送到 stderr 而不是 stdout,而 FOR /F 只捕获 stdout。如果发生这种情况,那么您还必须使用2>&1. 在 FOR /F IN() 子句中必须对特殊字符进行转义(或引用)。

禁用可以解决您的问题的 DELIMS 和 EOL 有一个尴尬的语法:

for /f delims^=^ eol^= %%i in ('C:\pathto\dig.exe www.example.com @8.8.8.8 +short 2^>^&1') do set RIP=%%i

如果未设置 RIP,IF 失败的原因是左侧完全为空,导致解析器失败。您可以通过在两边添加引号(或任何字符)来解决此问题。但是您还应该在循环之前明确清除 RIP 值,以防万一先前的命令先前设置了 RIP。

set "RIP="
for /f "delims=" %%i in ('C:\pathto\dig.exe www.example.com @8.8.8.8 +short') do set RIP=%%i
If "%RIP%"=="93.184.216.119" (
  ECHO - PASS >> results-file.txt
) else (
  ECHO - FAIL >> results-file.txt
)
于 2014-11-21T05:15:16.613 回答