使用Windows批处理中的set设置空变量的问题

时间:2011-06-24 20:25:46

标签: batch-file

set var=%1
echo var
set command=""
IF var==true ( 
    set command=dir
)

IF var==false ( 
    set command=dir /a
)
echo %command%
%command%

所以,如果我通过输入

来运行这个脚本
C:\>test true

echo %command%始终打印""。有什么想法吗?

2 个答案:

答案 0 :(得分:11)

您缺少任何解除引用变量所需的%个符号。

你可能想要这样:

set var=%1
echo %var%
set command=""
IF %var%==true (                    <=== here
    set command=dir
)

IF %var%==false (                   <=== here
    set command=dir /a
)
echo %command%
%command%

您还应该用引号括起字符串比较以允许空格,如下所示:

IF "%var%"=="false"

此外,正如Joey指出的那样,清除变量是由

完成的
set command=

没有任何引号。否则,您将使用这些引号初始化变量,从而导致您的奇怪输出。

答案 1 :(得分:3)

如果您使用条件并设置条件,我挖掘出变量为空!

if errorlevel 0 (
   Set localVar="fooBar"
   echo "%localVar%"
)

将导致空输出!

string comparison in batch file相关 使用

SetLocal EnableDelayedExpansion

启用!VARNAME!,使!VARNAME!能够在条件下使用%VARNAME%,但仍然无法在条件块中启用EnableDelayedExpansion的输出!

在条件之前使用Set,以便在条件块中访问它。 OR用法必须是在条件块之后使用Set的。

(!)目前我不知道如何在同一个区块中挑战Set AND用法!

  
    

请参阅https://gist.github.com/childnode/0f6c874ad79788a86332

中的一些示例代码   

(!)但正如您在结果中所看到的(也在gist中)使用 DelayedExpansion 会产生不同的副作用:

变量是在同一个shell中第二次运行时设置的(显然是正确的)但由于某些原因在第二次运行中没有设置{{1}}(似乎它也清除了脚本中的“本地”变量并且没有' t导出以下命令! 如果在“管道”

中运行不同的批处理文件,这可能会导致其他错误