【问题标题】:How to get an Unix like atexit in Powershell?如何在 Powershell 中获得类似 atexit 的 Unix?
【发布时间】:2015-02-20 22:18:08
【问题描述】:

创建 OLE 对象时,必须在程序结束时释放它。否则进程会一直在后台运行。

我写了下面的例子:

$excel = New-Object -ComObject Excel.Application

# some long running code here

finally
{
  "running finally"
  [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
}

当我在中间的“长时间运行代码”期间使用 Ctrl-C 停止脚本时,finally 块不会被执行。每当我这样做时,我都会在进程表中得到另一个 EXCEL.EXE 进程。

即使用户使用 Ctrl-C 中断脚本,我如何才能可靠地释放 COM 对象?

【问题讨论】:

  • 第一个位是否至少在try 块中?
  • @arco444 有没有没有关系。
  • 看看this link - 第二个答案看起来适合你的场景
  • @arco444 看来我必须从头开始编写某种协作多任务处理才能获得退出处理程序。
  • 好吧,你至少需要两个线程。如果您在主程序中进行大量处理,则需要另一个线程来捕获某种中断并向主线程发出信号。使用作业将是在 Powershell 中执行此操作的方法。 Get-Help about_jobs

标签: powershell


【解决方案1】:

试试Engine Events(仅适用于控制台,不适用于 Powershell ISE):

# Set up automatic functionality on engine exit.
Register-EngineEvent PowerShell.Exiting -SupportEvent -Action {
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-11
    • 2011-07-15
    • 1970-01-01
    • 2022-12-02
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多