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

时间:2015-05-07 19:07:12

标签: file variables batch-file numbers numeric

批处理文件存在以下问题。我简化了下面的问题。

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

foo.bat

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

但是,从命令行执行echo %1word%将返回hey

这应该/可能是这样吗?是否不允许数字为环境变量名称添加前缀?

3 个答案:

答案 0 :(得分:5)

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

问题是批处理解析器在%1中看到初始%1word%并扩展第一个参数而不是变量。即使没有传递参数,它仍然将不存在的第一个参数扩展为空字符串。这些规则在https://stackoverflow.com/a/4095133/1012053https://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

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