VS2010:如何在后期构建中使用环境变量

13

在我的电脑上,我创建了一个名为3DSMaxInstallDirectory的系统环境变量。

在命令行中,如果我输入

echo %3DSMaxInstallDirectory%Plugins\

我明白了。

D:\Program Files\Autodesk\3ds Max 2011\Plugins\

在Visual Studio中,我进入“后构建”部分。

copy "$(TargetDir)$(TargetName).*" "$(3DSMaxInstallDirectory)Plugins\"

然而,在构建时我遇到了以下错误

Error   4   The command "copy "C:\Users\Sebastian\Documents\Visual Studio 2010\Projects\MaxBridge\MaxBridgeImporterPlugin\bin\Debug\MaxBridgePlugin.*" "Plugins\"
" exited with code 1.   MaxBridgeImporterPlugin

谷歌上的结果令人困惑,有些建议称Visual Studio不支持EVs,同时也有一些建议称Visual Studio支持EVs,还有一些建议需要使用%..%或$(..),但似乎这些方法都无法在我的电脑上正常工作。

在Visual Studio中正确使用我的环境变量的方法是什么?

(是的,该目录已存在,我不想显式地设置路径的原因是我正在准备共享此项目,每个人在下载和构建之前必须执行的每个步骤都会增加一个障碍。)


1
你以管理员身份运行Visual Studio吗? - Jean Hominal
@JeanHominal,我刚刚尝试了,但不幸的是没有任何区别。 - sebf
在 VS2010 中,使用 %var% 在后期构建中对我有效。 - rene
@rene,你能否发布完整的示例命令,以便我可以尝试并查看它是否是特定于我的计算机或环境变量? - sebf
5个回答

6

这对我来说在项目的'构建事件(Build Events)'的'后构建(Post-Build)'设置中有效。

echo %CodeContractsInstallDir%
echo %DXSDK_DIR%
echo "%ONLYME%"

ONLYME是我个人资料中用户变量的一个环境变量。

其他变量是系统范围的变量。

如果我以管理员身份启动VS2010,则ONLYME保持为空,而系统变量仍然按预期具有值。

我使用的是V2010 SP1版本。


1
谢谢您的信息,根据我的发现,“3DSMaxInstallDirectory”无法使用,但“_3DSMaxInstallDirectory”可以。我认为这是由于Visual Studio在csproj中将“%”转义为“%25”,当解析时变成了“%253”和“DSMax...”。 - sebf
1
这很奇怪!对我来说,使用echo %My Environmental Variable%\Some Sub Directory的结果是\Some Sub Directory;使用其他人建议的%25的结果是5My Environmental Variable's Value5\Some Sub Directory,使用%2实际上在echo中给出了期望的结果,但在xcopycopy中却没有!我尝试过的所有xcopy操作都没有将环境变量名称替换为其实际值。 - Matt Arnold
@MattArnold 这是哪个版本的msbuild,你是在Windows 10或类似的服务器操作系统上吗? - rene
@rene 我正在使用 Windows 10,在 Visual Studio 2019 中构建,项目是在 .NET 4.0 中 - 我该如何找到 MSBuild 版本? - Matt Arnold
@MattArnold 在 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\ 中打开命令提示符并运行 msbuild -ver。我期望它会显示 16.0。 - rene
@rene 我实际上需要运行这个命令(我使用的是专业版而不是社区版):C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin>MSBuild.exe -ver 但你很接近了,版本号是 16.6.0.22303 - Matt Arnold

5
'%' 字符被 MSBuild 保留,因此您需要将其替换为在 MSDN 中记录的 %25 十六进制转义序列。 copy "$(TargetDir)$(TargetName).*" "%253DSMaxInstallDirectory%25\Plugins" 应该可以正常工作。但是:Visual Studio 的命令行编辑器正确显示它,但 MSBuild 然后错误地解释 %253。我无法确定它是一个 bug 还是一个特性,但您不能以数字开头命名您的环境变量名称。

2
Visual Studio不能正确地编码/解码XML配置文件中的“特殊”字符。我可以通过手动将命令转义为URL(http://www.w3schools.com/tags/ref_urlencode.asp)来使其按预期工作。
ECHO %CD%

输出日志中的结果:
Target "PreBuildEvent" in file "blahblahblah"
    Task "Exec"
        Command:
        ECHO %CD%
        C:\blah\blah\blah\Debug
    Done executing task "Exec".

然而,在项目属性对话框中使用URL转义似乎起作用:
ECHO %25CD%25

我认为缺失的编码是在通过 GUI 输入自定义命令时(当然,如果您编辑 .vcxproj 文件,则必须自行编码)。如果您想要取消投票,请留下评论。我曾遇到过这个问题,这就是我解决它的方式。编辑:澄清使用编码和不使用编码的结果。 - whitey04

0

如果您想使用在VS启动后定义的环境变量,则.vcxproj和.csproj项目的规则不同。在.vcxproj项目中,在项目属性中编写%MY_ENV_VAR%将无法工作 - 您需要使用转义语法%25MY_ENV_VAR%25。但是,.csproj项目确实接受%MY_ENV_VAR%; 使用转义语法会导致转义序列被破坏,从而得到%2525MY_ENV_VAR%2525。(至少在VS2017中如此。)


0
根据这个MS Link,语法现在与使用项目文件变量相同,这意味着您不再需要担心转义%字符。例如,如果BIN_PATH是一个环境变量,并且在后生成步骤中添加了以下行:

echo $(BIN_PATH)

,则此行将在生成后将BIN_PATH的值显示到输出窗口。
但请注意,在启动VS之前必须定义环境变量。当我第一次尝试这个功能时,浪费了约45分钟,直到我意识到可能之所以不起作用是因为VS在启动时加载环境变量。因此,我退出VS,重新启动,就像魔术般地解决了问题。
如果您的环境变量与VS项目变量相同,则仍然可能需要旧的%字符语法,因为“项目文件中的属性会覆盖环境变量的值”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接