2013-02-18 93 views
3

我已經得到了我們通過一個很多對象的咀嚼劇本,有時我要殺死它在運行中間,因爲我看到的東西南下。不幸的是,我正在使用System.IO.StreamWriter寫入日誌文件,並且每當我發送一個Ctrl-C時,我的日誌文件都被打開。在PowerShell腳本終止上運行代碼來關閉文件?

有什麼辦法,我可以定義某種處理或退出功能,讓我正常關閉句柄和我有打開的連接?

回答

4

可以嘗試使用的try/catch /最後,把你的close()在finally塊命令。

+1

我做的是,在節目的各種事物的幾個部分,但它更像是我需要的東西,像打擊「陷阱control_c SIGINT」的等價物。雖然我想我可以把整個腳本放在一個巨大的try語句中,然後拋出一個finally {}。你可以嵌套嘗試語句?這似乎是錯誤的方式。 – 2013-02-18 15:59:44

+1

是的,你可以嵌套Try語句。 – mjolinor 2013-02-18 16:16:19

1

要終止腳本,使用exit。如果拋出一個異常,使用try/catch/finally接近()在finally命令。如果它只是一個if測試,嘗試這樣的事情:

function Close-Script { 
    #If stream1 is created 
    if($stream1) { 
     $stream1.Close() 
    } 

    #Terminate script 
    exit 
} 

$stream1 = New-Object System.IO.StreamWriter filename.txt 


If(a test that detects your error) { 
    Close-Script 
} 

如果streamwriters的數量從時間變化到時間,你可以收集他們的數組,並關閉它們。例如:

function Close-Script { 
    #Close streams 
    $writers | % { $_.Close() } 

    #Terminate script 
    exit 
} 

$writers = @() 
$stream1 = New-Object System.IO.StreamWriter filename.txt 
$writers += $stream1 
$stream2 = New-Object System.IO.StreamWriter filename2.txt 
$writers += $stream2 

If(a test that detects your error) { 
    Close-Script 
} 
+0

謝謝。 If語句能夠捕捉到的實際錯誤更少。這更像是我正在監視調試輸出並且說:「哦,那是錯誤的,我必須修復它」,但我不能殺死它,直到它完成了150多個實體的循環。 – 2013-02-18 16:00:33

+0

如果你在使用'ctrl + c'後想要一個清理函數,你可以使用我提供的函數,但是你需要在全局作用域(例如'$ global:writers')中創建變量,源運行腳本('。\ myscript.ps1'),然後調用'近Script''CTRL + C' – 2013-02-18 16:14:06

2

使用PowerShell 2.0,你可以定義一個Trap當發生終止錯誤時會觸發。您可以定義多個陷阱來捕獲不同的異常。這可能導致更清潔的代碼要比散落try/catch無處不在,或在一個大try/catch環繞整個腳本。

+1

後可悲的是,它看起來並不像我可以捕獲按Ctrl-C(不管它表現爲,腳本本身)。至少,我還沒有想出如何去做。 – 2013-02-18 19:40:21