如何使用在变量名中有一个点的环境变量?

时间:2016-08-19 12:58:22

标签: batch-file batch-processing

我写了一些代码,其中我需要使用一个文件中的值并在另一个文件中使用它。只要变量名称中没有.,代码就可以正常工作。但是对于变量名Project.Name,下面的代码无法产生预期的结果。

for /f "tokens=1,2* delims==" %%x in (%temp%\project.properties) do (
    if "%%x"=="Project.Name" set %%x=%%y
)
echo Project_Name=!Project.Name!

Windows命令处理器不将!Project.Name!视为变量。

2 个答案:

答案 0 :(得分:0)

错误,点被接受(以及其他特殊字符,如[]几乎让你相信批处理文件理解数组)。

您可以像这样检查:

>set project.name=xxxx
>set proj
project.name=xxxx

你的问题不同了。您必须为此

启用延迟扩展

概念证明:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

for /f "tokens=1,2* delims==" %%x in (foo.txt) do (
    if "%%x"=="Project.Name" set %%x=%%y
)
echo Project.Name=!Project.Name!

我的foo.txt文件:

Project.Name=xxxx
kdfldkflkd=12

输出:

Project.Name=xxxx

答案 1 :(得分:0)

批量代码中的 IF 条件是区分大小写的字符串比较。

if "%%x"=="Project.Name"

因此,如果文件包含例如Project.name,则字符串比较永远不会为真。

在不知道文件project.properties的内容的情况下帮助你几乎是不可能的,但我认为你需要这样的东西:

@echo off
for /F "usebackq tokens=1* delims== " %%x in ("%TEMP%\project.properties") do (
    if /I "%%x"=="Project.Name" set "%%x=%%y" & goto FoundProjectName
)
echo Could not find Project.Name in file project.properties.
goto :EOF

:FoundProjectName
echo Project_Name=%Project.Name%

如果环境变量TEMP不包含至少有1个空格的文件夹路径,需要在双引号中指定带有路径的文件名,这需要usebackq的规范来处理,我会感到非常惊讶来自文件的行而不是使用带有空格的路径来解释文件名作为要处理的字符串。这可能是循环后没有定义环境变量Project.Name的另一个原因。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • echo /?
  • for /?
  • goto /?
  • if /?
  • set /?