2015-01-16 20 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。在这种情况下,如果需要分号的效果,命令必须输出换行符。否则,你不会得到多个路径,而是一个长路径,里面有分号。