2015-01-16 19 views
1

某些批次變量名時,我有一個自定義生成命令VS2013項目。在命令腳本中,我設置了一個環境變量,並在同一個腳本中再次讀取它。我可以通過調用set來確認設置變量是否有效。但是,根據變量名稱,我無法再讀出它。腐敗使用自定義生成命令

當作爲一個批處理腳本按預期運行以下工作:

set AVAR=xxx 
set ABLAH=xxx 
set BBLAH=xxx 
set DEV=xxx 
set @ABLAH=xxx 

echo %AVAR% 
echo %ABLAH% 
echo %BBLAH% 
echo %DEV% 
echo %@ABLAH% 

但是生產項目的輸出如下:

1> xxx 
1> «LAH 
1> »LAH 
1> ÞV 
1> xxx 

在這種情況下,該名AVAR作品,但許多別人不會。另外,以@開頭的變量似乎可行。任何想法是怎麼回事?

+0

我無法重現該問題。批處理腳本在我的機器上按預期工作。 –

+1

還有一件事。在輸出中打印的非ASCII字符看起來是%HH的十六進制表示,其中HH是來自標識符的兩個十六進制數字。例如。 '«'= 0xAB,'»'= 0xBB等。非十六進制顯然不被解釋。我不知道這種特定的編碼,但它可能會給你一個提示。 –

回答

1

批處理文件通常是在北美和使用像code page 850(OEM多語言拉丁語I)或code page 437(OEM美國)的OEM代碼頁西歐國家「ASCII」文件,而不是代碼頁Windows-1252如通常用於編碼的單字節使用文本文件。用於批處理文件的代碼頁取決於控制檯中非Unicode文件的本地設置。代碼頁並不重要,只要代碼值小於128的字符在批處理文件中使用,即批處理文件是真實的ASCII文件。

因此,請確保您使用正確的代碼頁編輯並保存批處理文件爲ASCII文件,而不是使用UTF-8,UTF-16 Little Endian或UTF-16 Big Endian作爲Unicode文件。 Visual Studio的編輯器默認使用文件的UTF-8編碼。這是批處理文件的錯誤編碼。

字符«在代碼頁850中的代碼值174十進制(是0xAB)的表。在代碼頁1252碼值174的表是性格®這是要輸出爲UTF-8或Windows-1252(也可用於字符®碼值174)編碼的批處理文件的字符的指示。

存儲爲ANSI文件,代碼頁的Windows 1252的示範一個簡單的批處理代碼。

@echo off 
cls 
echo This batch file was saved as ANSI file using code page Windows-1252. 
echo. 
echo Registered trademark symbol ® has code value 174 in Windows-1252. 
echo. 
echo But active code page is not Windows 1252 in console window. 
echo. 
chcp 
echo. 
echo Therefore the left guillemet character is output instead of registered 
echo trademark symbol as this character has in code page 850 code value 174. 
echo. 
echo Press any key to continue ... 
pause>nul 

和批處理文件是DOS/Windows的,因此應使用回車+換行符作爲行終止,而不是隻換行(UNIX)或只是回車(舊MAC)。

某些文本編輯器顯示分別線路終端器類型和編碼代碼頁某處狀態欄在主應用程序窗口的底部,用於活動文件。

3

我已經找到了解決辦法。 Visual Studio (msbuild) converts %XX escape sequences like in URLs.我只希望它能像URL那樣在瀏覽器中做到。但是,它似乎在任何地方都取代它們。

所以當它遇到%ABCDE%時,它識別%AB並插入字符« = 0xAB,給«CDE%給批量解釋器。但是,如果代碼不是有效的十六進制數字,它會默默地忽略它,解釋器會看到正確的字符。這就是爲什麼在開始時@的變量名稱始終有效。

因此,解決方案是至少在前面有效的十六進制代碼00-FF,至少全部%,甚至所有的%25

一個簡單的解決方案是隻編輯GUI中的相應命令(通過項目屬性),而不是直接在.vcxproj或.props文件中編輯。這樣,VS插入正確的轉義碼。在我的情況下,這是不可能的,因爲命令被定義爲用戶宏(屬性頁:通用屬性/用戶宏)。我的命令跨越多行,但用戶宏編輯器僅支持單行。

另一件值得注意的事情是,它不僅取代百分號。其他符號具有特殊含義,也必須替換。 (這超出了XML實體,如& -> &。)以下是來自MSDN的list of special characters。字符是:% $ @ ' ; ? *。似乎沒有必要一直替換所有這些,但如果您注意到時髦行爲,那麼這是一件需要注意的事情。您可以嘗試通過GUI輸入這些字符,並查看VS如何以及VS是否在項目文件中轉義它們。

其他特別注意的是分號。如果你使用非轉義分號定義一個屬性,如<MyPaths>DirA;DirB</MyPaths>,msbuild/VS將在內部將它們轉換爲換行符(好吧,或者將屬性分割成列表或其他東西)。但它仍然會在屬性頁面中以分號顯示路徑!除了單擊屬性旁邊的下拉按鈕並選擇<Edit...>時,它會將路徑顯示爲列表或用換行符分隔!這在大多數情況下完全不可見,除非您設置的屬性不是XML或GUI,但您是reading the output of a command into a property。在這種情況下,如果需要分號的效果,命令必須輸出換行符。否則,你不會得到多個路徑,而是一個長路徑,裏面有分號。