Windows批处理文件:if else

63

我正在编写一个简单的批处理文件,它需要一个参数(你可以提供更多,但我会忽略它们)。

为了测试,这是我目前的代码。

if not %1 == "" (
    dir /s/b %1
) else (
    echo no
)
基本上,我想说如果提供了一个参数,则递归显示文件夹中的所有文件。否则,说不。

当我提供参数时它可以工作,但是如果我不提供参数它会告诉我( was unexpected at this time

我的意思是,它可以工作,但我希望至少显示一个用户友好的消息来解释为什么它不起作用。我应该如何更改代码?

6个回答

77
if not %1 == "" (

必须是

if not "%1" == "" (
如果没有传递参数,它是完全空的,甚至没有""(在大多数编程语言中表示空字符串)。因此,我们使用周围的引号来检测空参数。

2
所以基本上就是一个空值。我明白了。 - MxLDevs
1
如果不是 {%1} == {},则更加安全,因为如果 %1 的值为引号,则 "%1"=="" 会返回 true。 - workabyte
2
@workabyte:使用大括号可能会更加混乱,特别是当%1指向路径或文件时,因为与大括号字符 {} 不同,双引号 " 永远不会出现在任何 Windows 路径或文件名中。因此,你可能会避免尝试解决解析为 {}} }} == {} 的问题。也许更现实的是,注意到例如 {{ea14c59a-889c-495b-8bb6-be78cf960e93}.txt} == {{ea14c59a-889c-495b-8bb6-be78cf960e93.txt}} 是错误的。 - Glenn Slayden

21

在你的%1周围加上一些东西。

例如:

if not "%1" == ""

我经常看到的另一个例子:

if not {%1} == {}

问题,如您可以猜到的那样,是%1被字面上替换为空白。 它不是“空字符串”,实际上它是源文件中那一点的一个空白处。

在替换之后,解释器尝试解析if语句并变得困惑了。


16

你需要执行以下操作:

if "%1" == "" (
    echo The variable is empty
) ELSE (
    echo The variable contains %1
)

3
这里的关键是ELSE应该与IF语句的右括号在同一行,否则会出错。 - rook

9

另一个相关提示是使用"%~1"而不是"%1"。在Windows命令行中键入"CALL /?"以获取更多详细信息。


3
%~1 - 扩展 %1 并移除任何周围的引号("),这样其他人就不必查找它了。 - Noumenon

4

另一种方法是设置一个变量,并检查它是否已定义:

SET ARG=%1
IF DEFINED ARG (echo "It is defined: %1") ELSE (echo "%%1 is not defined")

不幸的是,直接使用%1DEFINED一起使用无效。


1

你需要像这样做...

如果不是"A%1"等于"A"

如果输入参数%1为空,你的代码将会出现问题。


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