关于命令行:
set VAR 2> nul && echo Yes. || echo No!!
似乎
nul
和
&&
之间的
空格被视为变量名的一部分,因此
set
不会检查以
VAR
开头的变量名称,而是
VAR
+
空格,这显然未定义。
我创建了一个包含许多测试的批处理文件,将有用的
评论中的例子整合进去,该评论由用户
LotPings提供。
@echo on
@for %%I in ("Value" "") do @(
set "VAR=%%~I"
echo/& < nul set /P ="VARIABLE: "
if defined VAR (set VAR) else echo VAR=
call :SUB
)
@goto :EOF
:SUB
@echo/& echo UNQUOTED (VAR):
set VAR && echo Yes. || echo No!!
set VAR> nul && echo Yes. || echo No!!
set VAR > nul && echo Yes. || echo No!!
set VAR 2> nul && echo Yes. || echo No!!
(set VAR > nul) && echo Yes. || echo No!!
(set VAR 2> nul) && echo Yes. || echo No!!
set VAR > nul&& echo Yes. || echo No!!
set VAR 2> nul&& echo Yes. || echo No!!
> nul set VAR && echo Yes. || echo No!!
2> nul set VAR && echo Yes. || echo No!!
@echo/& echo QUOTED ("VAR"):
set "VAR" && echo Yes. || echo No!!
set "VAR"> nul && echo Yes. || echo No!!
set "VAR" > nul && echo Yes. || echo No!!
set "VAR" 2> nul && echo Yes. || echo No!!
(set "VAR" > nul) && echo Yes. || echo No!!
(set "VAR" 2> nul) && echo Yes. || echo No!!
set "VAR" > nul&& echo Yes. || echo No!!
set "VAR" 2> nul&& echo Yes. || echo No!!
> nul set "VAR" && echo Yes. || echo No!!
2> nul set "VAR" && echo Yes. || echo No!!
@goto :EOF
这是相关的控制台窗口输出:
>>> test-set.bat
VARIABLE: VAR=Value
UNQUOTED (VAR):
>>> set VAR && echo Yes. || echo No!!
VAR=Value
Yes.
>>> set VAR 1>nul && echo Yes. || echo No!!
Yes.
>>> set VAR 1>nul && echo Yes. || echo No!!
Environment variable VAR not defined
No!!
>>> set VAR 2>nul && echo Yes. || echo No!!
No!!
>>> (set VAR 1>nul ) && echo Yes. || echo No!!
Yes.
>>> (set VAR 2>nul ) && echo Yes. || echo No!!
VAR=Value
Yes.
>>> set VAR 1>nul && echo Yes. || echo No!!
Yes.
>>> set VAR 2>nul && echo Yes. || echo No!!
VAR=Value
Yes.
>>> set VAR 1>nul && echo Yes. || echo No!!
Yes.
>>> set VAR 2>nul && echo Yes. || echo No!!
VAR=Value
Yes.
QUOTED ("VAR"):
>>> set "VAR" && echo Yes. || echo No!!
VAR=Value
Yes.
>>> set "VAR" 1>nul && echo Yes. || echo No!!
Yes.
>>> set "VAR" 1>nul && echo Yes. || echo No!!
Yes.
>>> set "VAR" 2>nul && echo Yes. || echo No!!
VAR=Value
Yes.
>>> (set "VAR" 1>nul ) && echo Yes. || echo No!!
Yes.
>>> (set "VAR" 2>nul ) && echo Yes. || echo No!!
VAR=Value
Yes.
>>> set "VAR" 1>nul && echo Yes. || echo No!!
Yes.
>>> set "VAR" 2>nul && echo Yes. || echo No!!
VAR=Value
Yes.
>>> set "VAR" 1>nul && echo Yes. || echo No!!
Yes.
>>> set "VAR" 2>nul && echo Yes. || echo No!!
VAR=Value
Yes.
VARIABLE: VAR=
UNQUOTED (VAR):
>>> set VAR && echo Yes. || echo No!!
Environment variable VAR not defined
No!!
>>> set VAR 1>nul && echo Yes. || echo No!!
Environment variable VAR not defined
No!!
>>> set VAR 1>nul && echo Yes. || echo No!!
Environment variable VAR not defined
No!!
>>> set VAR 2>nul && echo Yes. || echo No!!
No!!
>>> (set VAR 1>nul ) && echo Yes. || echo No!!
Environment variable VAR not defined
No!!
>>> (set VAR 2>nul ) && echo Yes. || echo No!!
No!!
>>> set VAR 1>nul && echo Yes. || echo No!!
Environment variable VAR not defined
No!!
>>> set VAR 2>nul && echo Yes. || echo No!!
No!!
>>> set VAR 1>nul && echo Yes. || echo No!!
Environment variable VAR not defined
No!!
>>> set VAR 2>nul && echo Yes. || echo No!!
No!!
QUOTED ("VAR"):
>>> set "VAR" && echo Yes. || echo No!!
Environment variable VAR not defined
No!!
>>> set "VAR" 1>nul && echo Yes. || echo No!!
Environment variable VAR not defined
No!!
>>> set "VAR" 1>nul && echo Yes. || echo No!!
Environment variable VAR not defined
No!!
>>> set "VAR" 2>nul && echo Yes. || echo No!!
No!!
>>> (set "VAR" 1>nul ) && echo Yes. || echo No!!
Environment variable VAR not defined
No!!
>>> (set "VAR" 2>nul ) && echo Yes. || echo No!!
No!!
>>> set "VAR" 1>nul && echo Yes. || echo No!!
Environment variable VAR not defined
No!!
>>> set "VAR" 2>nul && echo Yes. || echo No!!
No!!
>>> set "VAR" 1>nul && echo Yes. || echo No!!
Environment variable VAR not defined
No!!
>>> set "VAR" 2>nul && echo Yes. || echo No!!
No!!
只有这些情况会失败:
set VAR > nul && echo Yes. || echo No!!
set VAR 2> nul && echo Yes. || echo No!!
当命令解析器识别并临时删除重定向部分(请参阅
Windows命令解释器(CMD.EXE)如何解析脚本?中第2阶段的描述),在
>
之前和/或之后的潜在
SPACEs会留下,这些空格似乎被
set
视为变量名的一部分,除非给定的变量名带引号;但只能容忍一个总共的
SPACE。
同时看看带有不同数量空格的变量名的错误消息
Environment variable VAR not defined
。
set
命令似乎以一种特定的方式处理其参数。
@set "VAR=Value"
set VAR
set VAR
set VAR
set "VAR"
set "VAR "
set "VAR "
未引用的语法似乎不遵循标记化的标准规则,其中两个或更多连续的标记分隔符(如SPACE)会组合成一个单一的标记。
让我感到惊讶的是,即使是带引号的语法,也会容忍一个SPACE,尽管它至少忽略了在闭合"
后面的所有SPACEs。
更令人惊讶的是,在SPACE后面有一些其他文本(如X
),仍然不会返回错误:
@set "VAR=Value"
set VAR X
set VAR X
set "VAR X"
set "VAR X"
(set VAR) 2>nul &&echo Yes.|| echo No!!
- 或者 -(set VAR 2>nul) &&echo Yes.|| echo No!!
,同时>
和nul
之间不要有空格 =>set VAR 2>nul&&echo Yes.||echo No
。 - user6811411If Defined VAR (Echo Yes) Else Echo No.
- Componul
和&&
之间的空格很重要。我刚刚发现2> nul set VAR && ... || ...
也能按预期工作;似乎有一个空格被视为变量名的一部分... - aschipfl