【问题标题】:Run code on powershell script termination to close files?在 powershell 脚本终止时运行代码以关闭文件?
【发布时间】:2013-02-19 01:01:26
【问题描述】:

我有一个脚本正在咀嚼很多对象,有时我想在运行过程中杀死它,因为我看到有东西往南走。不幸的是,我正在使用 System.IO.StreamWriter 写入日志文件,每当我发送 Ctrl-C 时,我的日志文件都会卡在打开状态。

有什么方法可以定义某种处理程序或退出函数,让我可以优雅地关闭我打开的文件句柄和连接?

【问题讨论】:

    标签: powershell terminate


    【解决方案1】:

    可以尝试使用 Try/Catch/Finally,将 close() 命令放在 finally 块中。

    【讨论】:

    • 我在程序的几个部分中为各种事情这样做,但更像是我需要类似于 Bash 中的“trap control_c SIGINT”的东西。虽然我想我可以将整个脚本放在一个巨大的 try{} 语句中并抛出 finally{}。你可以嵌套 try 语句吗?这似乎是错误的方式。
    • 是的,您可以嵌套 Try 语句。
    【解决方案2】:

    使用 PowerShell 2.0 及更高版本,您可以定义一个 Trap,它会在发生终止错误时触发。您可以定义多个陷阱来捕获不同的异常。这可能会导致比到处乱扔垃圾的try/catch 更干净的代码,或者将整个脚本包装在一个大的try/catch 中。

    【讨论】:

    • 可悲的是,看起来我无法捕获 Ctrl-C(无论脚本本身显示为什么)。至少,我还没想好怎么做。
    【解决方案3】:

    要终止脚本,请使用exit。如果引发异常,请使用try/catch/finallyfinally 中的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
    }
    

    【讨论】:

    • 谢谢。 If 语句捕获的实际错误更少。这更像是我在看调试输出并说,“哦,那错了,我必须修复它”,但我无法杀死它,直到它完成 150 多个实体的循环。
    • 如果您在使用ctrl+c 后想要一个清理功能,您可以使用我提供的功能,但您需要在全局范围内创建变量(例如$global:writers),或者运行脚本时点源(. .\myscript.ps1),然后在ctrl+c之后调用Close-Script
    猜你喜欢
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2011-01-02
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多