【问题标题】:Problem of empty variable using set in Windows Batch在 Windows Batch 中使用 set 的空变量问题
【发布时间】:2011-06-24 20:25:46
【问题描述】:
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% 总是打印""。有什么想法吗?

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    您缺少任何变量取消引用所需的一些 % 符号。

    你可能想要这样:

    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=
    

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

    【讨论】:

    • 这不是他们指出问题的地方。问题中的问题仍然存在。
    • @Joey:我认为你错了。因为var 永远不会被正确引用,command 永远不会被初始化为期望值。
    • @Joey:不适合我。您是否使用truefalse 作为参数调用脚本?
    • 我可以确认 Joey 的问题在我的 Win7 64 位的情况下仍然存在正确的 %% quuotation 但上面的脚本无法重现它.. 我会检查我是否可以得到另一个例子。真奇怪..
    • set command= 没有引号和空格似乎环绕到下一行,并且总体上对脚本做了非常奇怪的事情。我花了很长时间调试它!
    【解决方案2】:

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

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

    将导致空输出!

    string comparison in batch file相关 使用

    SetLocal EnableDelayedExpansion
    

    启用!VARNAME!,这将启用在下面的条件下使用!VARNAME!,但仍不会在条件块中启用%VARNAME%的输出!

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

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

    查看https://gist.github.com/childnode/0f6c874ad79788a86332中的一些示例代码

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-03
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多