【问题标题】:Batchfile: cmd.exe closes if variable has semicolon?批处理文件:如果变量有分号,cmd.exe 会关闭吗?
【发布时间】:2015-01-18 19:35:13
【问题描述】:

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

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 刚刚关闭,并且没有任何内容写入文件,并且该批次的其余部分不会继续。

知道我哪里出错了吗?

【问题讨论】:

  • 使用引号。 set "RIP=%%~i"If "%RIP%"=="93.184.216.119" (。我想这就是问题所在。
  • 感谢您的帮助,这很有效 - 非常感谢!

标签: windows batch-file dig


【解决方案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
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 2022-06-15
    相关资源
    最近更新 更多