有效的批处理文件变量名?
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"。
我的批处理文件有以下问题。我把问题简化如下。
运行 以下批处理文件,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"。