我已經得到了我們通過一個很多對象的咀嚼劇本,有時我要殺死它在運行中間,因爲我看到的東西南下。不幸的是,我正在使用System.IO.StreamWriter寫入日誌文件,並且每當我發送一個Ctrl-C時,我的日誌文件都被打開。在PowerShell腳本終止上運行代碼來關閉文件?
有什麼辦法,我可以定義某種處理或退出功能,讓我正常關閉句柄和我有打開的連接?
我已經得到了我們通過一個很多對象的咀嚼劇本,有時我要殺死它在運行中間,因爲我看到的東西南下。不幸的是,我正在使用System.IO.StreamWriter寫入日誌文件,並且每當我發送一個Ctrl-C時,我的日誌文件都被打開。在PowerShell腳本終止上運行代碼來關閉文件?
有什麼辦法,我可以定義某種處理或退出功能,讓我正常關閉句柄和我有打開的連接?
可以嘗試使用的try/catch /最後,把你的close()在finally塊命令。
要終止腳本,使用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
}
謝謝。 If語句能夠捕捉到的實際錯誤更少。這更像是我正在監視調試輸出並且說:「哦,那是錯誤的,我必須修復它」,但我不能殺死它,直到它完成了150多個實體的循環。 – 2013-02-18 16:00:33
如果你在使用'ctrl + c'後想要一個清理函數,你可以使用我提供的函數,但是你需要在全局作用域(例如'$ global:writers')中創建變量,源運行腳本('。\ myscript.ps1'),然後調用'近Script''CTRL + C' – 2013-02-18 16:14:06
使用PowerShell 2.0,你可以定義一個Trap
當發生終止錯誤時會觸發。您可以定義多個陷阱來捕獲不同的異常。這可能導致更清潔的代碼要比散落try/catch
無處不在,或在一個大try/catch
環繞整個腳本。
後可悲的是,它看起來並不像我可以捕獲按Ctrl-C(不管它表現爲,腳本本身)。至少,我還沒有想出如何去做。 – 2013-02-18 19:40:21
我做的是,在節目的各種事物的幾個部分,但它更像是我需要的東西,像打擊「陷阱control_c SIGINT」的等價物。雖然我想我可以把整個腳本放在一個巨大的try語句中,然後拋出一個finally {}。你可以嵌套嘗試語句?這似乎是錯誤的方式。 – 2013-02-18 15:59:44
是的,你可以嵌套Try語句。 – mjolinor 2013-02-18 16:16:19