2013-02-18 21 views
0

我們使用Start-TranscriptStop-Transcript來記錄PowerShell腳本的輸出。

腳本正在執行應用程序的安裝,因此如果遇到任何錯誤,我們還會使用$ErrorActionPreference = "Stop"來停止執行。

這樣做的問題是如果發生錯誤,轉錄本會在錯誤輸出到控制檯之前停止。這意味着錯誤不會包含在我們的日誌文件中。這個擁有真實的,即使我們使用try...finally如下:從運行此腳本

Start-Transcript "$(Split-Path $MyInvocation.MyCommand.Path -Leaf)-$((Get-Date).toUniversalTime().ToString('yyyy-MM-ddTHH-mm-ss')).log" 

$ErrorActionPreference = "Stop" 

try 
{ 
    Write-Host "various things happening" 

    Write-Error "an error" 
} 
finally 
{ 
    Stop-Transcript 
} 

控制檯輸出爲:

E:\> .\Testing.ps1 
Transcript started, output file is Testing.ps1-2013-02-18T11-39-27.log 
various things happening 
Transcript stopped, output file is ... 
Write-Error : an error 
At ... 

我們可以做些什麼,以確保該錯誤消息被包括在日誌中?

回答

0

我們發現這樣做的以下解決方案,具體如下:

Start-Transcript "$(Split-Path $MyInvocation.MyCommand.Path -Leaf)-$((Get-Date).toUniversalTime().ToString('yyyy-MM-ddTHH-mm-ss')).log" 

$ErrorActionPreference = "Stop" 

trap { 
    Write-Error $error[0] -ErrorAction Continue 
    Stop-Transcript 
    exit 1 
} 

Write-Host "various things happening" 
Write-Error "an error" 

Stop-Transcript 
1

也許這可以工作:

Start-Transcript "$(Split-Path $MyInvocation.MyCommand.Path -Leaf)-$((Get-Date).toUniversalTime().ToString('yyyy-MM-ddTHH-mm-ss')).log"  
$ErrorActionPreference = "Stop" 
try 
{  
    write-host " A million stuff to do..."  
    $a = 1/0  
} 

catch [system.exception] 
{ 
    Write-host "Exception String: "+ $($_.Exception.Message) 
    Stop-Transcript 
} 
try{ 
    stop-transcript 
} 
catch [System.InvalidOperationException]{}