windows cmd 如何设置解析变量名?

zhe*_*oli 4 windows cmd batch-file environment-variables

如果我运行set如下:

C:\Users\vagrant>SET UNDEFINED=foo

C:\Users\vagrant>SET UNDEFINED
UNDEFINED=foo

C:\Users\vagrant>SET UNDEFINED  
Environment variable UNDEFINED   not defined

C:\Users\vagrant>SET UNDEFINED | more
UNDEFINED=foo

C:\Users\vagrant>SET UNDEFINED >nul

C:\Users\vagrant>SET UNDEFINED >nul 
Environment variable UNDEFINED   not defined

C:\Users\vagrant>SET UNDEFINED  | more
Environment variable UNDEFINED   not defined

C:\Users\vagrant>SET UNDEFINED >nul | more
Environment variable UNDEFINED   not defined

C:\Users\vagrant>SET UNDEFINED >nul| more

C:\Users\vagrant>SET UNDEFINED 2>nul | more

C:\Users\vagrant>SET UNDEFINED 2>nul| more
UNDEFINED=foo
Run Code Online (Sandbox Code Playgroud)

注意,上面的第二个命令是SET UNDEFINED ,后面有两个空格。而且SET UNDEFINED >nul SET UNDEFINED >nul | moreSET UNDEFINED 2>nul | more与前一个更大的空间|。在这些命令中,set用另外两个空格解析变量。那么如何set解析变量名。我还找到了cmd parse scripts,但是这里如何标记变量名?

编辑 当使用空格前文件重定向时会出现此问题。换句话说,在字符串后添加空格并重定向。示例: echo foo>bar.txt 前面的空格bar.txt被附加到文件中foo .

以下是这方面的示例:

例子:

在此处输入图片说明

结果是:

在此处输入图片说明

Ger*_*ard 5

当您添加额外的空格时,您实际上是在告诉 set 确实显示一个被调用"UNDEFINED "%UNDEFINED %实际上未定义的变量的值。您可以看到,如果您set "UNDEFINED" 处理双引号后的空格,则空格将不再是问题。它与执行相同的操作set UNDEFINED =foo不会为%UNDEFINED%bu返回变量,而是为%UNDEFINED %

以下是这方面的示例:

set UNDEFINED=foo
set UNDEFINED =foo
Run Code Online (Sandbox Code Playgroud)

然后运行时,没有任何额外的空格:

set UNDEFINED 结果如预期。

UNDEFINED=foo
UNDEFINED =foo
Run Code Online (Sandbox Code Playgroud)

但是当您使用额外的空格运行它时,由于您提供了额外的空格 set UNDEFINED ,结果不再匹配%UNDEFINED%

UNDEFINED =foo
Run Code Online (Sandbox Code Playgroud)

在这里我们可以展示更多匹配的工作原理

set UNDEF=foo
set UNDEFI=foo
set UNDEFIN=foo
set UNDEFINE=foo
set UNDEFINED=foo
set UNDEFINED =foo
set UNDEFINED  =foo
set UNDEFINED   =foo
Run Code Online (Sandbox Code Playgroud)

现在看看所有这些的结果

set UN
set UNDEF
set UNDEFINE
set UNDEFINED
Run Code Online (Sandbox Code Playgroud)

显然通过添加空格: set UNDEFINED

但是如果我们添加 4 个空格,代表一个我们从未设置过的变量,那么我们将得到 un undefinedvariable 结果。 set UNDEFINED

最后,要克服这个问题是确保我们正确设置变量并用双引号将它们引用以获得所需的结果。

set "UNDEFINED=foo"
set "UNDEFINED"
Run Code Online (Sandbox Code Playgroud)

后面的 set 命令不会关心你在双引号结束后给了多少空格,它会返回任何包含这个词的变量UNDEFINED。IEset "UNDEFINED"

使用 redirects>或 pipe 的结果也是如此|。具体使用重定向。之前的所有内容都>被视为您要重定向的字符串。例子:

echo foo >out.txt
Run Code Online (Sandbox Code Playgroud)

将导致out.txt包含foo 包含空格。因此,需要排除空格,但如果您的字符串以数字结尾,这就会成为一个问题。IE

echo foo2>out.txt
Run Code Online (Sandbox Code Playgroud)

这将重定向stderr到文件。所以我们再次克服了这个问题,通过将代码括起来:

(echo foo)>out.txt
Run Code Online (Sandbox Code Playgroud)

因此,鉴于您的示例,nul除非您指定类型 (stdout/stderr),否则管道不会返回任何结果

(SET UNDEFINED)2>nul|more
(SET UNDEFINED)1>nul|more
(SET UNDEFINED)>nul|more
Run Code Online (Sandbox Code Playgroud)

编辑

再次。在带有空格的字符串之前的附加空格将在输出中添加空格。再次使用echo

(echo foo | more)>out.txt
Run Code Online (Sandbox Code Playgroud)

之间有一个空格foo|如果您查看结果,out.txt您会注意到该空格。这同样适用于重定向>因此在这些实例中使用括号括起来的块来消除空格。

编辑2

根据您提供的屏幕截图。cmd以一种它并不真正关心您放置它的位置的方式使用重定向。

>out.txt echo foo

将导致:

foo
Run Code Online (Sandbox Code Playgroud)

在文件中。添加空格的地方,将被附加到文件中

>out.txt echo foo 会导致 foo

与您的示例类似,它将回显您在重定向行中提供的任何内容。

echo foo>out.txt

或者

echo foo>out.txt . 将附加到文件中,因为重定向实际上是这里的关键功能,它将附加您提供的内容。

但是,您会注意到重定向本身,然后在命令之前提供额外的空格不会这样做。这仅仅是因为您要求系统将字符串重定向到文件,然后空格成为命令分隔符。所以这:

>out.txt echo foo 只会导致 foo您的输出文件。

所以.. 确保我们不添加这些不需要的空格的最佳方法是: >out.txt(echo foo)