批处理文件:如果变量有分号,cmd.exe会关闭吗?

时间:2014-11-20 19:41:46

标签: windows batch-file dig

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

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替换它)然后,通常从命令行挖掘。 exe将超时并最终返回...

;; connection timed out; no servers could be reached

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

知道我哪里出错了?

1 个答案:

答案 0 :(得分:1)

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

错误消息也可能发送到stderr而不是stdout,而FOR / F只捕获stdout。如果发生这种情况,那么您还必须使用2>&1将stderr重定向到stdout。在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
)