如何在PowerShell中捕获控制台关闭事件?

5

如何在PowerShell中捕获控制台关闭事件?

我已经尝试添加一个控制台控制处理程序,对于CMD来说它可以正常工作,但是在PowerShell中却不行,有没有一种不同的方法?

示例:

namespace Test_ConCtrl {
    class Program {
        public enum CtrlTypes : uint { CTRL_C = 0, ... }

        public delegate Boolean ConsoleCtrl_Delegate(CtrlTypes CtrlType);

        [DllImport("kernel32.dll")]
        static extern bool SetConsoleCtrlHandler(
            ConsoleCtrl_Delegate HandlerRoutine, bool Add);

        public static Boolean My_CtrlHandler(CtrlTypes inConType) {
            switch(inConType) { ... }
        }

        static void Add_Handler() {
            ConsoleCtrl_Delegate myHandler = My_CtrlHandler;
            SetConsoleCtrlHandler(myHandler, true);
        }

        ...

这不清楚是关于“控制台关闭”(即PowerShell退出方式)还是Ctrl-C事件。有关PowerShell退出,请参见我的答案。 - Roman Kuzmin
其实,我想涵盖PowerShell退出和Ctrl+C,Ctrl+C是否有不同的处理方式?(我正在启动一个后台IO线程,如果用户中止cmdlet,我希望能够中止它) - Sam Porch
1个回答

7
在PowerShell中,使用引擎事件PowerShell.Exiting并指定处理它的脚本块。以下是示例:
Register-EngineEvent PowerShell.Exiting -Action { "Exiting $(Get-Date)" >> C:\TEMP\log.txt }

是的,这就是答案——引擎事件。我知道PowerShell事件处理很关键,但不知道下一步该怎么做。非常感谢。 - Sam Porch
奇怪的是,这对我或这里的一些人都没有起作用。https://github.com/PowerShell/PowerShell/issues/8000 有没有办法在关闭PowerShell控制台时触发一个函数? - LiquidMetal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接