2016-08-19 103 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 /?