批处理文件存在以下问题。我简化了下面的问题。
运行以下批处理文件foo.bat,在标准输出(在本例中为命令提示符窗口)而不是word
中返回hey
。
@SET 1word="hey"
@ECHO %1word%
但是,从命令行执行echo %1word%
将返回hey
。
这应该/可能是这样吗?是否不允许数字为环境变量名称添加前缀?
答案 0 :(得分:5)
您可以创建和使用名称以数字 开头的环境变量,但这不是一个好主意,应该避免 。定义变量没问题。但使用正常的百分比扩张进行扩张是一个问题。
问题是批处理解析器在%1
中看到初始%1word%
并扩展第一个参数而不是变量。即使没有传递参数,它仍然将不存在的第一个参数扩展为空字符串。这些规则在https://stackoverflow.com/a/4095133/1012053和https://stackoverflow.com/a/7970912/1012053解释。
您可以使用延迟扩展来访问变量。
以下是演示问题的示例脚本:
@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%
可以在命令提示符下正常工作。
由于复杂性,故事的寓意是 - “不要使用以数字开头的变量名称”。
答案 1 :(得分:3)
%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
答案 2 :(得分:1)
在批处理文件中,%1是传递的第一个参数,因此执行./foo.bat hello可能会打印
helloword
尝试使用参数执行批处理文件以查看这是否是您的问题