【发布时间】:2013-02-19 01:01:26
【问题描述】:
我有一个脚本正在咀嚼很多对象,有时我想在运行过程中杀死它,因为我看到有东西往南走。不幸的是,我正在使用 System.IO.StreamWriter 写入日志文件,每当我发送 Ctrl-C 时,我的日志文件都会卡在打开状态。
有什么方法可以定义某种处理程序或退出函数,让我可以优雅地关闭我打开的文件句柄和连接?
【问题讨论】:
标签: powershell terminate
我有一个脚本正在咀嚼很多对象,有时我想在运行过程中杀死它,因为我看到有东西往南走。不幸的是,我正在使用 System.IO.StreamWriter 写入日志文件,每当我发送 Ctrl-C 时,我的日志文件都会卡在打开状态。
有什么方法可以定义某种处理程序或退出函数,让我可以优雅地关闭我打开的文件句柄和连接?
【问题讨论】:
标签: powershell terminate
可以尝试使用 Try/Catch/Finally,将 close() 命令放在 finally 块中。
【讨论】:
使用 PowerShell 2.0 及更高版本,您可以定义一个 Trap,它会在发生终止错误时触发。您可以定义多个陷阱来捕获不同的异常。这可能会导致比到处乱扔垃圾的try/catch 更干净的代码,或者将整个脚本包装在一个大的try/catch 中。
【讨论】:
要终止脚本,请使用exit。如果引发异常,请使用try/catch/finally 和finally 中的close() 命令。如果它只是一个 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
}
如果 streamwriter 的数量不时变化,您可以将它们收集到一个数组中并关闭它们。例如:
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
}
【讨论】:
ctrl+c 后想要一个清理功能,您可以使用我提供的功能,但您需要在全局范围内创建变量(例如$global:writers),或者运行脚本时点源(. .\myscript.ps1),然后在ctrl+c之后调用Close-Script