使用MSBuild Exec任务运行PowerShell脚本时出现异常

4
我遇到了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>

该命令的执行方式与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个回答

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

请仔细检查您的路径。

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

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

因此,对于您来说,调用cmd.exe并运行它可能完全正常,因为您的工作目录将与C:\users\yourusername匹配

对于msbuild.exe来说,它很可能无法找到该文件,因为它是从类似于*C:\Windows\Microsoft.NET\Framework\v4.0*的位置开始的。

因此,它正在寻找C:\Windows\Microsoft.NET\Framework\v4.0\Scripts\SetSth.ps1

我建议尝试使该文件路径完全合格化。如果仍然无法正常工作,请让cmd.exe将其结果转储到属性中,并让msbuild记录它。然后您可以查看路径。


谢谢您的回答。但是脚本启动后会引发异常。所以问题肯定不在这里。目前我正在查看SVNFOLDER路径中的“%20”。我猜测MSBuild试图用一个项目替换它?! - BoBBuilder
不应该出现问题,因为msbuild使用%%语法来解析特殊字符,就像任何基于xml的系统一样。你可以尝试在属性中构建命令字符串,然后在日志中输出该属性,看看它是否与您预期的相匹配。 - Taylor Bird
很奇怪。如果我运行MSBuild脚本,它会写入目标名称和命令“powershell -file“Scripts\SetSth.ps1”-PARAM“C:\abc\cde”-SVNID 1234-SVNFOLDER“https://domain/svn/rep/branches/xy%20(Build%2012)”,但是powershell得到的是“powershell -file“Scripts\SetSth.ps1”-PARAM“C:\abc\cde”-SVNID 1234-SVNFOLDER“https://domain/svn/rep/branches/xy0(Build012)”,所以“%20”被替换为“0”,这不是我在脚本中期望的(我在其中进行匹配和替换)。现在的问题是,为什么MSBuild告诉我它使用“%20”而不是“0”? - BoBBuilder
你使用“0”是用来做什么的?如果只是为了触发查找替换,能否使用一些不是ASCII短码的东西?MSBUILD是XML,因此%20是有效的代码,而不仅仅是一些字符串。你可能需要使用[[CDATA来传递它而不受影响...但如果你只是想触发一个“嘿,在这里替换”,你能不能使用其他东西,比如--**--? - Taylor Bird

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