检查DOS批处理文件中的输入命令?

5

我正在我的dos批处理文件中将输入参数作为命令运行,就像我在这里提问的一样:在dos批处理脚本中运行输入参数作为命令。 这个方法是有效的,但我遇到了一个问题:我需要检查输入的命令是否为空。 我的做法如下:

SETLOCAL
set CMD=%*
echo Running command [%CMD%]
IF "%CMD%"=="" (
 echo "Input argument missing: command"
 GOTO :end
)
echo "XXX %CMD%"

并运行:

script.bat echo "a b c"

将输出:
Running command [echo "a b c"]
b was unexpected at this time.

这发生在IF条件中,但为什么呢?

如何检查输入是否为空。我知道如何在dos中检查字符串是否为空,但由于某种原因,在这种组合中它不起作用:(
顺便说一句: 如果我删除IF条件,它就能正常工作,也就是说,命令被正确执行。

  • 艾德
1个回答

3
首先检查参数是否缺失,然后再分配和处理命令。
IF .%1 == . (
 echo "Input argument missing: command"
 GOTO :eof
)

SETLOCAL    
set CMD=%*
echo Running command [%CMD%]
echo "XXX %CMD%"

关于“为什么?”这是由于CMD的值中的引号(在a之前的引号)关闭了%CMD%之前的引号,因此字符串显示为"echo "a b c"",因此b被从字符串中分离出来,导致命令处理器失败。(它期望一个比较标记,如==EQU,而不是一些奇怪的b)。

3
+1,因为您总是正确的。但我更喜欢使用if "%~1"=="",因为它通常更安全。 - jeb
谢谢,我想得太复杂了 :( - edbras
@jeb:谢谢。我也考虑过"%~1"=="",但是如果第一个参数只是""(而第二个参数是非空值),那么这可能会误导人。我的意思是,我们不能确定是否可以指定"",所以我想用. %1 ==.测试。 - Andriy M
1
是的,那么一个空的 "" 会失败,但像 &< 这样的字符串不会创建语法错误,但唯一真正安全的版本似乎是 REM 技术 - jeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接