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%
始终打印""
。有什么想法吗?
答案 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用法!
中的一些示例代码
(!)但正如您在结果中所看到的(也在gist中)使用 DelayedExpansion 会产生不同的副作用:
变量是在同一个shell中第二次运行时设置的(显然是正确的)但由于某些原因在第二次运行中没有设置{{1}}(似乎它也清除了脚本中的“本地”变量并且没有' t导出以下命令! 如果在“管道”
中运行不同的批处理文件,这可能会导致其他错误