2016-08-19 210 views
1

我写了一些代码,我需要使用一个文件中的值并在另一个文件中使用它。只要变量的名称中没有.,代码就可以正常工作。但对于变量名称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!作为变量。

+0

的紫外线很好的解析代码(几乎)的作品。 –

+1

你的'project.properties'文件中的变量周围是否有任何空格,所以像'Project.Name = some_project'或_space_ +'Project.Name = some_project'这样的东西? – aschipfl

回答

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 
+0

我在代码中使用SETLOCAL ENABLEDELAYEDEXPANSION,但它没有采用它。有没有其他原因? –

+0

你可以发布你的输入文件吗?看到我的编辑:我提供了一个脚本和数据文件,整个产生你需要的输出。 –

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 /?