从MSBuild Exec Task运行powershell脚本的异常

时间:2011-02-06 11:27:25

标签: powershell msbuild cmd

我遇到了MSBuild和Powershell的问题。我想在MSBuild exec-Task中执行PS脚本。

问题:直接从CMD运行脚本,但在MSBuild中运行脚本我收到错误。

这里是MSBuild脚本:

<Import Project="$(MSBuildExtensionsPath)\ExtensionPack\4.0\MSBuild.ExtensionPack.tasks"/>
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>

<PropertyGroup>  
    <PathToSvnClient>C:\Program Files (x86)\CollabNet\Subversion Client</PathToSvnClient>
</PropertyGroup>

<ItemGroup>
    <!-- set Folder to Svn Repository for svn info command-->
    <SvnFolder Include="$(MSBuildProjectDirectory)\.."/>
</ItemGroup>

<Target Name="SvnInfo">
    <!-- get SVN Revision and Repository Path -->
    <SvnInfo LocalPath="%(SvnFolder.FullPath)" ToolPath="$(PathToSvnClient)">
        <Output TaskParameter="Revision" PropertyName="Revision" />
        <Output TaskParameter="RepositoryPath" PropertyName="RepositoryPath" />
    </SvnInfo>
</Target>

<Target Name="SetProductVersion" DependsOnTargets="SvnInfo">
    <Exec Command="powershell -file &quot;Scripts\SetSth.ps1&quot; -PARAM &quot;$(PathToSth)&quot; -SVNID $(Revision) -SVNFOLDER &quot;$(RepositoryPath)&quot;" LogStandardErrorAsError="true" ContinueOnError="false"/>
</Target>

Command的执行方式与CMD完全相同,但我从Powershell脚本中获取SVNFOLDER参数的异常。

执行的命令如下所示:

powershell -file "Scripts\SetSth.ps1" -PARAM "C:\abc\cde" -SVNID 1234
-SVNFOLDER "https://domain/svn/rep/branches/xy%20(Build%2012)" 

所以从CMD开始,它可以在MSBuild中运行。我不知道为什么。我希望你有个主意。

2 个答案:

答案 0 :(得分:4)

使用双引号和单引号的方法怎么样:

<Target Name="SetProductVersion" DependsOnTargets="SvnInfo">
    <Exec Command="powershell -command &quot;&amp; {Scripts\SetSth.ps1 -PARAM '$(PathToSth)' -SVNID '$(Revision)' -SVNFOLDER '$(RepositoryPath)'}&quot;" LogStandardErrorAsError="true" ContinueOnError="false"/>
</Target>

答案 1 :(得分:1)

仔细检查你的路径。

请记住,以这种方式调用的powershell在执行构建的任何用户下运行为Msbuild.exe。对于msbuild.exe,直接调用cmd.exe将在msbuild所在的工作目录中启动。

假设-file "Scripts\SetSth.ps1"引用 C:\ users \ yourusername \ Scripts \ SetSth.ps1

所以对你来说,调用cmd.exe并运行它可以正常工作,b / c你的工作目录将匹配 C:\ users \ yourusername < / p>

对于msbuild.exe,它可能无法找到该文件,因为它的开头是 * C:\ Windows \ Microsoft.NET \ Framework \ v4.0 *

所以它正在寻找 C:\ Windows \ Microsoft.NET \ Framework \ v4.0 \ Scripts \ SetSth.ps1

我会尝试使该文件路径完全合格。如果仍然无效,请让cmd.exe将其结果转储到属性中并让msbuild将其记录下来。然后你可以查看路径。