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

zs2*_*020 7 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%
Run Code Online (Sandbox Code Playgroud)

所以,如果我通过键入来运行此脚本

C:\>test true
Run Code Online (Sandbox Code Playgroud)

echo %command%始终打印"".任何的想法?

Fra*_*ack 13

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

你可能想要这样:

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%
Run Code Online (Sandbox Code Playgroud)

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

IF "%var%"=="false"
Run Code Online (Sandbox Code Playgroud)

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

set command=
Run Code Online (Sandbox Code Playgroud)

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


chi*_*.de 6

如果您使用条件并设置条件,我发现该变量为空!

if errorlevel 0 (
   Set localVar="fooBar"
   echo "%localVar%"
)
Run Code Online (Sandbox Code Playgroud)

将导致空输出!

批处理文件 使用中的字符串比较有关

SetLocal EnableDelayedExpansion
Run Code Online (Sandbox Code Playgroud)

启用!VARNAME!它可以!VARNAME!在下面的条件中使用,但仍然不会%VARNAME%在条件块中启用输出!

使用 Set BEFORE 条件使其在条件块中可访问。OR 用法必须在使用 Set 的条件块之后。

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

请参阅https://gist.github.com/childnode/0f6c874ad79788a86332 中的一些示例代码

(!) 但是正如您在使用DelayedExpansion的结果(也在要点中)中看到的那样,它具有不同的副作用:

变量是在同一个 shell 中第二次运行时设置的(显然是正确的)但由于某些原因没有EnableDelayedExpansion在第二次运行中设置(似乎它还从脚本中清除了“本地”变量,并且不会为以下命令导出它!这个如果在“管道”中运行不同的批处理文件可能会导致其他错误