2012-07-25 43 views
1

可能重複:
Any good PowerShell MSBuild tasks?在的MSBuild,我怎麼運行的東西PowerShell和報告所有錯誤

PowerShell的似乎並不有一個簡單的方法與觸發它任意命令,然後以正確與非PowerShell的調用者互操作的方式冒泡解析和執行錯誤 - 例如,cmd.exe,TeamCity等。

我的問題很簡單。對於我來說,使用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嵌入"報價,它不會工作

那麼,什麼是運行PowerShell的MSBuild中應該是的防彈呢?有什麼我可以PsGet使一切OK?

回答

1

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。

我會穿上我的大衣。

2

您可以使用下面的例子:

<InvokeScript Condition="..." 
       PowerShellProperties="..." 
       ScriptFile="[PATH TO PS1 FILE]" 
       Function="[FUNCTION TO CALL IN PS1]" 
       Parameters="..." 
       RequiredOutputParams="..."> 
    <!-- You can catch the output in an Item --> 
    <Output TaskParameter="OutputResults" 
      ItemName="Output" /> 
</InvokeScript> 

這可以在MSBuild的使用。

+0

我假設你指的是[Bart de Smet的任務版本(目前駐留在MSBuild擴展包中)](http://stackoverflow.com/a/3465029/11635)?這就是我在問題 – 2012-10-10 10:41:22

+0

中半ossase OOTB位的原因反思,感謝讓我意識到這是一個重複的問題。請參閱http:// stackoverflow。com/a/12817556/11635你可以投票結束這個問題(假設你同意) – 2012-10-10 10:49:19

相關問題