【问题标题】:Batch scripting: Why does this condition evaluate to true?批处理脚本:为什么这个条件评估为真?
【发布时间】:2023-04-05 04:36:01
【问题描述】:

创建一个包含以下内容的批处理文件:

@echo off
setlocal

echo %1
if [%1] == [] echo hi

然后像这样从命令提示符运行它:

script.cmd ==

它将输出以下内容:

ECHO is off.
hi

为什么会这样,它是如何发生的?另外,如何更可靠地检查批处理脚本中的空字符串?

谢谢。

【问题讨论】:

  • 核心问题是=符号构成了一个记号分隔符,也像空格tab,;,所以脚本的行为就像没有给出参数一样;将其放在"" 之间会取消它们的特殊含义并按字面​​意思保留它们;使用%~1 访问参数会删除引号...

标签: windows batch-file cmd windows-10 command-prompt


【解决方案1】:
@ECHO OFF
SETLOCAL
SET "cmdtail=%*"
ECHO(%cmdtail%
IF "%cmdtail%"=="==" ECHO two "="

但回到未说明的原始问题。

请注意,此语法将检测作为命令尾部提供的==,而%~1 不会评估为==

【讨论】:

    【解决方案2】:

    在这种情况下,我建议使用以下方法:

    @echo off
    setlocal
    
    echo(%~1
    if "%~1"=="" echo hi
    

    而不是script.cmd == 使用script.cmd "=="

    请注意,我使用了echo(,如果变量被视为空,它将回显换行符,并且我使用了%~1,它从%1 参数中删除了周围的引号。

    您需要使用引号,因为 equal-sign is treated as a delimeter in the arguments,除非在引号内,就像空格一样。

    【讨论】:

    • 有趣!我不知道echo. 把戏。感谢您提供简洁/信息丰富的答案!
    • 关于 Dostips 的讨论很大,如果目录中有一个名为 echo 的文件,echo. 可能会产生意想不到的结果。最好使用echo(
    • @SomethingDark 你在说this 我想?之前没读过,读过之后同意echo(确实更好。
    • 是的,就是这样。我总是忘记整个“echo/ for a blank line”部分。
    猜你喜欢
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2011-12-22
    • 2014-05-19
    • 2016-01-28
    • 1970-01-01
    相关资源
    最近更新 更多