自定义MSBuild Exec任务的系统环境变量路径

自定义MSBuild Exec任务的系统环境变量路径,msbuild,Msbuild,我正在尝试使用Exec任务调用在MSBuild过程中获取的批处理脚本。但是,脚本的位置不是path系统环境变量的一部分。因此,我想我可以更新目标中的Path属性,然后触发Exec任务: <Target Name="RestoreNPMPackages"> <Message Text="$([System.DateTime]::Now.ToString(&quot;yyyy-MM-dd hh.mm.ss.fff&quot;)) Entering Build.x

我正在尝试使用Exec任务调用在MSBuild过程中获取的批处理脚本。但是,脚本的位置不是path系统环境变量的一部分。因此,我想我可以更新目标中的Path属性,然后触发Exec任务:

<Target Name="RestoreNPMPackages">
  <Message Text="$([System.DateTime]::Now.ToString(&quot;yyyy-MM-dd hh.mm.ss.fff&quot;)) Entering Build.xml Target RestoreNPMPackages..." Importance="high" />

  <PropertyGroup>
    <Path>$(Path);$(WorkspaceRoot)\Tools\$(Node_jsPackage)</Path>
  </PropertyGroup>

  <Message Text="Property Path in RestoreNPMPackages=$(Path)" Importance="high" />

  <Exec Command="$(Path)\npm install --no-color --no-optional" />

  <Message Text="$([System.DateTime]::Now.ToString(&quot;yyyy-MM-dd hh.mm.ss.fff&quot;)) Exiting Build.xml Target RestoreNPMPackages..." Importance="high" />

$(路径)$(WorkspaceRoot)\Tools\$(节点\u jsPackage)

但是,我得到了以下错误

恢复性包装: 2015-07-27 06.31.24.334进入Build.xml目标恢复包。。。 RestoreNPMPackages中的属性路径=d:\Delphi Projects\Libraries;C:\Windows\Microsoft.NET\Framework\v4.0.30319;C:\PROGRA~1\Borland\Delphi5\Projects\Bpl;C:\PROGRA~1\Borland\vbroker\jre\Bin;C:\PROGRA~1\Borland\vbroker\Bin;C:\PROGRA~1\Borland\Delphi5\Bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\ProgramFiles(x86)\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\ProgramFiles(x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\;C:\ProgramFiles(x86)\Microsoft Visual Studio 9.0\Common7\IDE\PrivateSassemblies\;C:\ProgramFiles(x86)\Microsoft SQL Server\100\DTS\Binn\;C:\ProgramFiles(x86)\GNU\GnuPG;C:\Program Files\Microsoft\Web平台安装程序\;C:\ProgramFiles(x86)\Microsoft ASP.NET\ASP.NET网页\v1.0\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\RealTick\;C:\ProgramFiles(x86)\Graphviz 2.28\bin;D:\PLATFORM\Tools\Eze.Thirdparty.Node.js npm安装--无颜色--无可选 “npm”未被识别为内部或外部命令, 可操作的程序或批处理文件

从消息任务中,我可以看到文件夹D:\PLATFORM\Tools\Eze.Thirdparty.Node.js已添加到Path变量中,但由于某些原因,它抱怨“npm”未被识别为内部或外部命令

如果将文件夹D:\PLATFORM\Tools\Eze.Thirdparty.Node.js添加到Windows中的Path变量而不是MSBuild脚本中,则该命令将正常工作。当然,提前设置Path变量听起来不是很灵活

如何使Path变量的即时更新在MSBuild Exec任务中工作?感谢已将添加到它确实具有的路径变量中,但是
Path
是MsBuild进程中的一个属性,它与Exec任务使用的环境变量不同。您可以验证这一点:

<Exec Command="echo %PATH%"/>
如果出于某种原因,npm需要将其所在的目录添加到路径中,则只需像在命令行上那样执行此操作:
(set PATH=…)&npm
。要为exec执行此操作,您需要使用
&
退出
&

<Exec Command="(set PATH=$(Path)) &amp; npm" />


其中,
路径
按照您的问题进行修改。更多解释。

我在Jeff Hardy's找到了这个问题的实际解决方案:


基本上是在命令行上设置环境变量。或者,您可以运行多行脚本:

<PropertyGroup>
  <PythonExec><![CDATA[
set PYTHONPATH=C:\Foo
set FOO=42
python script.py
  ]]></PythonExec>
</PropertyGroup>

<Exec Command="$(PythonExec)" />

以上都是杰夫·哈代的博客。我测试了一个案例,其中我使用了
$PATH
,使用了“长格式”技术,它对我很有效。


<ItemGroup>
  <ExecLines Include="call C:\esp-idf\export.bat" />
  <ExecLines Include="idf.py build" />
</ItemGroup>

<Exec Command="@(ExecLines->'%(Identity)&amp;')" WorkingDirectory="$(SolutionDir)" />

Exec
任务设置环境变量的另一种方法是其
EnvironmentVariables
参数,该参数接受
Variable=Value
定义的列表()。例如,以下代码设置
Var1
Var2
环境变量:


您可以用同样的方法设置
路径
变量。但是,必须使用百分比编码对其值中的所有分号进行转义:


C:\Foo;D:\Bar

非常感谢!我的构建服务器的路径上有Node.js v0.12,但Node.js v6.x安装在其他地方,我使用它允许我的ASP.NET Core 2网页包项目使用较新的Node.js。不过,我不得不做一个小改动,在PATH=$(PATH)周围加上引号,因为有些路径中有空格。我已在您的答案中添加了引号。如果
PATH
contains'),该怎么办?这不会导致不平衡的括号吗?(“传统的”
PATH
包括“程序文件(x86)”@shmiltheca是的,好的一点是,OP的路径名很短,因此没有括号或空格,否则您需要在下面的链接或Ross的答案中提供引号或其他解决方案。
<PropertyGroup>
  <PythonExec><![CDATA[
set PYTHONPATH=C:\Foo
set FOO=42
python script.py
  ]]></PythonExec>
</PropertyGroup>

<Exec Command="$(PythonExec)" />
<ItemGroup>
  <ExecLines Include="call C:\esp-idf\export.bat" />
  <ExecLines Include="idf.py build" />
</ItemGroup>

<Exec Command="@(ExecLines->'%(Identity)&amp;')" WorkingDirectory="$(SolutionDir)" />