2011-04-16 105 views
55

我正在做一个简单的批处理文件,需要一个参数(您可以提供更多,但我忽略它们)。Windows批处理文件:if else

对于测试,这是我迄今为止。

if not %1 == "" (
    dir /s/b %1 
) else (
    echo no 
) 

基本上,我想说如果提供了一个参数,递归地显示文件夹中的所有文件。否则,说不。

它提供了一个参数,但如果我不提供一个它只会告诉我(was unexpected at this time

我的意思是,它的工作原理,但我想至少显示一个用户友好的信息,解释为什么它不起作用。我应该如何更改代码?

回答

64
if not %1 == "" (

必须

if not "%1" == "" (

如果参数没有给出,它是完全空的,甚至没有""(代表大多数编程语言中的空字符串)。所以我们用周围的引号来检测一个空的参数。

+1

所以它基本上是一个空值。我知道了。 – MxyL 2011-04-16 00:36:04

+1

如果不是{%1} == {}更安全,因为%1的值为引号时,“%1”==“”将为真。 – workabyte 2016-03-31 17:43:28

+2

@workabyte:如果'%1'引用一个路径或文件,使用大括号可能会让你更加困惑,因为与大括号字符'{'和'}'不同,'''双引号'''不能出现在任何Windows路径或文件名,所以你可能会避免试图解决那些可以解析为'{}}}} {}'的东西,或许更现实的一点是,请注意'{{ea14c59a-889c-495b-8bb6-be78cf960e93} .txt} == {{ea14c59a-889c-495b-8bb6-be78cf960e93.txt}}'例如,为false。 – 2016-12-09 22:11:14

19

用一些东西环绕你的%1

如:

if not "%1" == "" 

另外一个我见过的相当频繁:

if not {%1} == {} 

等等......

的问题,因为你可能可以猜到,是%1从字面上被替换为空虚。它不是'空字符串',它实际上是源文件中的一个空白处。

然后在替换之后,解释器试图解析if语句并且感到困惑。

8

另一个相关提示是使用“%〜1”而不是“%1”。输入“CALL /?”在Windows的命令行中获取更多详细信息。

+2

'%〜1 - 展开%1删除任何周围的引号(“)'去查找它。 – Noumenon 2016-12-28 19:29:18

9

你必须做到以下几点:

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

这里的重要部分是ELSE应与IF语句的右括号相同,否则会出错。 – rook 2017-03-17 16:19:24

1

你必须做这样的... ...

如果不是 “%1” == “A”

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

4

另一种方法是设置一个变量,并检查其是否被定义为:

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

不幸的是,直接使用%1DEFINED不起作用。