CMD变量名称限制?

时间:2014-03-03 22:11:08

标签: batch-file cmd

批处理文件变量名有什么限制,为什么?

我注意到我无法回显名为:)的变量。

h:\uprof>set :)=123

h:\uprof>set :)
:)=123

h:\uprof>echo %:)%
%:)%

从批处理文件中显然输出:)而不是%:)%。问题显然不在于set命令,因为变量和它的值出现在set的输出中。

奇怪的是,当分开时 - :) - 并且反转 - ): - 当用作变量名时,都会输出其给定的值。

3 个答案:

答案 0 :(得分:4)

:是变量扩展的字符串操作特殊字符。例如:

%var:~0,1%

因此,如果变量名中的:后面有任何内容,它将尝试执行字符串操作并失败。这允许:冒号字符本身或当没有任何跟踪它时。

有关扩展变量名称的规则:变量名称不得包含:后跟任何字符,否则变量扩展将失败。

请参阅set /?


set :)=123
set a)=123
set :a=123
set :=123
set )=123
echo %:)%
echo %a)%
echo %:a%
echo %:%
echo %)%

输出:

%:)%
123
%:a%
123
123

答案 1 :(得分:4)

用户定义的批处理环境变量名称中唯一不能出现的字符是=。 SET语句将在第一次出现=时终止变量名,后面的所有内容都将成为值的一部分。

分配包含:的变量名称很简单,但除非在特定情况下,否则通常无法扩展该值。

启用扩展程序(默认行为)

冒号是搜索/替换和子字符串扩展语法的一部分,它会干扰名称中包含冒号的变量的扩展。

有一个例外 - 如果:显示为名称中的最后一个字符,那么变量可以很好地扩展,但是你不能对值进行搜索和替换或子串扩展操作。 / p>

禁用扩展程序时

搜索/替换和子串扩展不可用,因此没有什么可以阻止包含冒号的变量扩展工作正常。

@echo off
setlocal enableExtensions

set "test:=[value of test:]"
set "test:more=[value of test:more]"
set "test"

echo(
echo With extensions enabled
echo -------------------------
echo %%test:%%              = %test:%
echo %%test::test=replace%% = %test::test=replace%
echo %%test::~0,4%%         = %test::~0,4%
echo %%test:more%%          = %test:more%

setlocal disableExtensions
echo(
echo With extensions disabled
echo -------------------------
echo %%test:%%     = %test:%
echo %%test:more%% = %test:more%

- 输出 -

test:=[value of test:]
test:more=[value of test:more]

With extensions enabled
-------------------------
%test:%              = [value of test:]
%test::test=replace% = :test=replace
%test::~0,4%         = :~0,4
%test:more%          = more

With extensions disabled
-------------------------
%test:%     = [value of test:]
%test:more% = [value of test:more]

有关变量扩展如何工作的完整描述,请参阅https://stackoverflow.com/a/7970912/1012053

答案 2 :(得分:0)

没有什么要注意的。

如果您有一个以数字开头的名称变量,例如set "1var=foo",这将使批处理脚本解析器认为它正在处理参数%1而不是变量%1var% ,即使没有传递任何参数,它仍将扩展为空字符串,从而产生var%。同样,如果您使用~开头变量,则解析器将期望以数字结尾的参数,例如%~dp0。但是,如果您不会用数字来终止它(set "~dp=bar"),将无法使用%~dp%来访问它,因为这将导致错误:

The following usage of the path operator in batch-parameter substitution is invalid: %~dp%

仍然可以通过延迟扩展(!1var!!~dp!)访问此类变量,但是为了保持清楚,最好避免首先使用数字或波浪号开头变量名。