【问题标题】:Valid batch file variable names?有效的批处理文件变量名?
【发布时间】:2015-07-18 12:47:28
【问题描述】:

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

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

foo.bat

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

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

是否有理由应该/可能会出现这种情况?环境变量名前面不能有数字吗?

【问题讨论】:

  • 我建议您的批次实际上返回 word 但您期待的是 "hey"
  • 你建议我编辑排版?我现在就这样做。谢谢,Magoo。

标签: file variables batch-file numbers numeric


【解决方案1】:

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

问题是批处理解析器在%1word% 中看到初始%1 并扩展第一个参数而不是变量。即使没有传递任何参数,它仍然会将不存在的第一个参数扩展为空字符串。规则在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% 在命令提示符下就可以正常工作了。

由于复杂性,故事的寓意是 - “不要使用以数字开头的变量名”。

【讨论】:

  • 您的参考资料很棒,您的解释也很透彻。谢谢,dbenham。
【解决方案2】:

%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

【讨论】:

  • 这很好,但我喜欢 dbenham 添加的有关允许在命令行中正确解析变量的情况以及如何使用延迟扩展修复批处理文件的信息。
【解决方案3】:

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

helloword

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2010-10-23
    相关资源
    最近更新 更多