任何人都知道任何好的MSBuild任务将执行PowerShell脚本并传递不同的参数?

我能够找到B#.NET博客:从MSBuild调用PowerShell脚本 ,但我希望有一些更精致的东西。

如果我找不到任何东西,我当然会继续使用该博客作为首发来磨练自己。

===============>>#1 票数:9

可以使用http://powershellmsbuild.codeplex.com/获取3.5。 如果有一个NuGet包可以通过NuGet包恢复来利用它会很好

4.0有一个Windows Powershell任务工厂 您可以 在代码库 中获得已经进入MSBuild扩展包(顶级任务库之一 - 400+任务和推荐在Inside MSBuild中)具有PowerShellTaskFactory (从下载部分下载帮助文件) 这个示例版本有一个偷看)。

===============>>#2 票数:7

您可能还想看看Psake - 一个基于PowerShell的构建环境。

===============>>#3 票数:4

重复的问答我发布了 ,这里是后人投票结束的后代。 关键的区别在于这个问题被限制为OOTB并且我的自我回答仍然在该约束内。

Powershell似乎没有一种简单的方法可以使用任意命令触发它,然后以一种与非PowerShell的调用者正确互操作的方式冒泡解析和执行错误 - 例如, cmd.exeTeamCity等。

我的问题很简单。 使用OOTB MSBuild v4和PowerShell v3对我来说最好的方法是什么(对建议开放 - 不会排除适当的生产准备好的MSBuild任务,但它需要比建议“它很容易” - 采取PowerShell任务工厂样本和调整它和/或成为它的维护者/父母“”来运行一个命令(一个小的脚本段,或(最常见的)一个.ps1脚本的调用。

我认为它应该是正常的,如:

<Exec 
  IgnoreStandardErrorWarningFormat="true"
  Command="PowerShell &quot;$(ThingToDo)&quot;" />

遗憾的是,这不起作用: -

  1. 如果ThingToDo无法解析,它会无声地失败
  2. 如果ThingToDo是不存在的脚本调用,则失败
  3. 如果你想传播一个基于ERRORLEVEL.cmd结果,它会变得毛茸茸
  4. 如果你想在ThingToDo嵌入"引号" ,它将无效

那么,什么是从MSBuild运行PowerShell的防弹方法应该是什么? 有什么我可以PsGet让一切都好吗?

回答

Weeeeelll,你可以使用像这样长篇大论的东西,直到找到更好的方法: -

<PropertyGroup>
  <__PsInvokeCommand>powershell "Invoke-Command</__PsInvokeCommand>
  <__BlockBegin>-ScriptBlock { $errorActionPreference='Stop';</__BlockBegin>
  <__BlockEnd>; exit $LASTEXITCODE }</__BlockEnd>
  <_PsCmdStart>$(__PsInvokeCommand) $(__BlockBegin)</_PsCmdStart>
  <_PsCmdEnd>$(__BlockEnd)"</_PsCmdEnd>
</PropertyGroup>

然后你需要做的就是“全部”:

<Exec 
  IgnoreStandardErrorWarningFormat="true"
  Command="$(_PsCmdStart)$(ThingToDo)$(_PsCmdEnd)" />

这个单一的兑换功能(除了捕获我能想到的所有错误类型)是它可以在任何PowerShell版本和任何MSBuild版本上运行OOTB。

我会得到我的外套。

===============>>#4 票数:1

有点乐趣,我设法提出了一个相当干净的方法来完成这项工作:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- #1 Place this line at the top of any msbuild script (ie, csproj, etc) -->
  <PropertyGroup><PowerShell># 2>nul || type %~df0|find /v "setlocal"|find /v "errorlevel"|powershell.exe -noninteractive -&amp; exit %errorlevel% || #</PowerShell></PropertyGroup>

  <!-- #2 in any target you want to run a script -->
  <Target Name="default" >

    <PropertyGroup> <!-- #3 prefix your powershell script with the $(PowerShell) variable, then code as normal! -->
      <myscript>$(PowerShell)
      #
      # powershell script can do whatever you need.
      #
      dir ".\*.cs" -recurse |% {
        write-host Examining file named:  $_.FullName
        # do other stuff here...
      } 
      $answer = 2+5
      write-host Answer is $answer !
      </myscript>
    </PropertyGroup>

    <!-- #4 and execute the script like this -->
    <Exec Command="$(myscript)" EchoOff="true" /> 
  </Target>
</Project>

笔记:

  • 您仍然可以使用标准的Exec Task功能! (参见: https//msdn.microsoft.com/en-us/library/x8zx72cd.aspx
  • 如果您的powershell脚本需要使用<>或&字符,只需将内容放在CDATA包装器中:

     <script2><![CDATA[ $(PowerShell) # your powershell code goes here! write-host "<<Hi mom!>>" ]]></script2> 
  • 如果你想将项目返回到msbuild脚本,你可以得到它们:

     <script3>$(PowerShell) # your powershell code goes here! (dir "*.cs" -recurse).FullName </script3> <Exec Command="$(script3)" EchoOff="true" ConsoleToMSBuild="true"> <Output TaskParameter="ConsoleOutput" PropertyName="items" /> </Exec> <Touch Files="$(items)" /> 

看到! 然后你可以使用另一个msbuild任务:D

  ask by Eric Schoonover translate from so

未解决问题?本站智能推荐:

1回复

配置MSBuild以启动PowerShell并运行Import-Module $(TargetFileName)

我正在学习如何在c#中开发PowerShell模块,但是没有Visual Studio集成来在导入模块的情况下启动PowerShell。 我想配置MSBuild来启动PowerShell并运行Import-Module $(TargetFileName)。 我将项目配置为库项目并设置
1回复

如何在Windows的旧MSBuild安装文件夹上安装MSBuild?

我正在编写一个Powershell脚本,以在TeamCity上自动构建.NET项目。 第一步是安装msbuild。 以下是到目前为止我得到的脚本: # download msbuild $Url = 'https://aka.ms/vs/15/release/vs_buildtools.e
2回复

偶发MSBUILD:错误MSB3428:

我有一个执行以下操作的PowerShell脚本: 使用devenv.exe升级旧的Visual Studio解决方案。 使用MSBuild构建升级的Visual Studio解决方案。 如果运行此脚本,则会收到一条错误消息,指出“ MSBUILD:错误MSB3428:无
1回复

如何使用MSBuild在编译时添加Azure函数的绑定?

我在Visual Studio中有一个Azure函数C#项目,其中有一些服务总线主题触发器。 我有一个powershell脚本,可以运行该脚本来复制bin中生成的function.json文件,并将其转换为队列绑定。 唯一的问题是,azure函数在名为_GenerateFunctionsPo
1回复

如何从Powershell运行Visual Studio调试uwp项目?

我想从Powershell以调试模式运行Visual Studio uwp proj,我知道如何从外部命令启动uwp应用程序 启动shell:AppsFolder \\ packageName参数 但是我想从Visual Studio像在调试模式下那样做。 你知道怎么做吗?
1回复

Visual Studio PreBuildEvent powershell字符串缺少终止符:

之前曾发生过我真正困惑的最奇怪的错误,所以我想我应该写一个自我答案来帮助人们。 我的googlefu整齐地没有显示,所以我们到了。 这是我原来的台词 这是我的PreBuild.ps1文件: 由于某种原因,脚本中的$projectDir变量同时包含projectdir和so
1回复

在构建浏览器中停止构建时如何执行PowerShell脚本

我有一个要求,当有人在TFS->构建浏览器中停止正在运行的构建时,我需要执行PowerShell脚本。 我可以通过任何事件或方法来实现我的代码吗? 到目前为止,我只知道构建前和构建后事件,但是这些事件对我没有帮助。 注意:我们使用TFS进行源代码控制和构建。 并使用Oc
1回复

如何使用PowerShell中的发布内部视觉工作室完全相同的功能

我想知道如何从PowerShell以与Visual Studio相同的方式发布。 例如,当您使用MVC项目启动Visual Studio时; 然后右键单击项目并选择“发布”; 出现一个对话框,您可以在再次单击“发布”中填写一些设置。 它按预期神奇地推动您的网站。 它还会创建一个文件
1回复

Powershell的MSBuild

我正在尝试从MSBuild(从Powershell)运行同步,该同步还包括预同步命令。 我无法正确执行命令。 我已经尝试了多种方法,但是最后要做的是: 我收到以下错误。 错误:无法识别的参数'“ -preSync:runCommand ='F:\\ Projects \
1回复

如何在Powershell中对文件更改运行MSBuild任务

我正在尝试在PowerShell中编写类似CSharp监视任务的内容。 所以,我想发生的是当CSharp文件在某个目录中更改时,它试图找到csproj文件并启动构建。 这是我目前所拥有的 我发现的是,在Find-And-Build-Project函数中, & $msbui