【问题标题】:Powershell - Changing X-button behavior of consolePowershell - 更改控制台的 X 按钮行为
【发布时间】:2020-02-24 16:47:57
【问题描述】:

我正在使用一个将 Excel 用作 COM 应用程序的脚本,因此每当我使用 X 按钮关闭我的 scipt 时,它都会在后台打开一个 Excel 任务。

所以我有一个函数可以在我将“退出”作为用户输入时关闭 Exceltask,但我希望能够关闭 控制台 并使用安慰。有什么方法可以改变 X 按钮的行为,所以它会首先触发一个功能,也许?提供有关该功能的想法:

function Close(){   
    if($workbook){$workbook.close($false)}
    if($excel){[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$excel)}
    [gc]::Collect()
    [gc]::WaitForPendingFinalizers()
    Remove-Variable excel -ErrorAction SilentlyContinue
    exit
}

编辑

正如thread (github) 所暗示的那样,通过 x 按钮退出似乎对我来说仍然是一个问题。

所以它感兴趣的原因是that

“如果 PowerShell 无法控制自己的终止,则事件 从不 启动:因此,关闭窗口/退出终端模拟器将不会运行事件处理程序。”

这正是按下 x 按钮所发生的情况。所以这个问题正在 PS 7.0 中考虑。另外this thread,讨论了同样的问题,也帮我找到了github上的线程。

【问题讨论】:

    标签: powershell com event-handling exit


    【解决方案1】:

    您可以在表单关闭时执行事件:

    $form.Add_FormClosing({
        # Actions to carry out when form closed.
    }) 
    

    编辑:

    $Null 抑制输出 - 您可以将其删除以查看发生了什么。

    以下代码在我的电脑上运行:

    Register-EngineEvent -SourceIdentifier PowerShell.Exiting -SupportEvent -Action { New-Item -Path c:\temp -Name text.txt }
    

    PS 窗口关闭时创建的文件

    【讨论】:

    • 对不起,我不是在谈论 Powershell 中的表单。我指的是 host 窗口中的 X 按钮。
    • 啊,对不起。看起来这个问题可能会有所帮助:stackoverflow.com/a/8429920/6203113
    • 所以我唯一能做的就是替换exit 命令触发的事件?无赖。
    • 否 - 查看 cmets,Exit 事件由从 PS v3 开始关闭窗口的 X 按钮触发
    • 好的,我试过这个:$null = Register-EngineEvent -SourceIdentifier ([System.Management.Automation.PsEngineEvent]::Exiting) -Action { echo hi },但它似乎不起作用。我在我的脚本和 powershell 窗口中尝试过,但老实说,我什至不知道 $null 在那里做什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 2020-06-25
    • 1970-01-01
    • 2016-01-23
    • 2014-12-15
    • 1970-01-01
    相关资源
    最近更新 更多