有效的批处理文件变量名?

Valid batch file variable names?

我的批处理文件有以下问题。我把问题简化如下。

运行 以下批处理文件,foo.bat,returns word 在标准输出(在本例中,命令提示符 window)而不是 hey.

foo.bat

@SET 1word="hey"
@ECHO %1word%

但是,从命令行执行 echo %1word% returns hey.

这种情况 should/might 是有原因的吗?是否不允许数字作为环境变量名称的前缀?

在批处理文件中,%1 是传递的第一个参数,因此执行 ./foo.bat hello 可能会打印

helloword

尝试使用参数执行批处理文件,看看这是否是您的问题

%0%9 保留供 Windows 命令处理器在批处理文件中使用。它们表示通过命令行接收的参数。这意味着变量不能以数字开头。

您可以使用一个简单的批处理文件对此进行测试:

::foo.bat
@echo %0 %1 %2

这样称呼它:

C:\Test>foo Param1 Param2

输出:

C:\Test>foo Param1 Param2
C:\Test\foo.bat Param1 Param2

您可以创建和使用名称以数字开头的环境变量,但这不是一个好主意,应该避免.定义变量没问题。但是使用正常的百分比扩展是一个问题。

问题是批处理解析器在 %1word% 中看到初始 %1 并展开第一个参数而不是变量。即使没有传递任何参数,它仍然会将不存在的第一个参数扩展为一个空字符串。规则在 and .

中解释

您可以改为使用延迟扩展来访问变量。

这是一个演示问题的示例脚本:

@echo off
setlocal enableDelayedExpansion
set "1var=Environment variable value."
call :test "Argument 1 value"
exit /b

:test
echo arg 1 = %1
echo 1var normal = %1var%
echo 1var delayed = !1var!

-- 示例输出 --

arg 1 = "Argument 1 value"
1var normal = "Argument 1 value"var
1var delayed = Environment variable value.

请注意,%1 形式的参数扩展只是批处理脚本中的一个问题 - 它与在命令提示符(非批处理)上下文中发出的命令无关。因此,您可以在命令提示符下定义 1word,然后 echo %1word% 在命令提示符下可以正常工作。

由于复杂性,故事的寓意是 - "don't use variable names that begin with a digit"。