【问题标题】:PowerShell ISE and PowerShell.Exiting eventPowerShell ISE 和 PowerShell.Exiting 事件
【发布时间】:2013-01-30 12:58:08
【问题描述】:

我正在使用 PowerShell.Exiting 引擎事件来保存我的命令历史记录,并在我关闭 PowerShell 会话时进行其他一些整理,从而将其注册到我的配置文件中:

# Set up automatic functionality on engine exit.
Register-EngineEvent PowerShell.Exiting -SupportEvent -Action `
{
    #stuff
    ...
}

当我在控制台窗口中使用 PowerShell 时,这非常有效,但是当我在 ISE 中运行 PowerShell 时,PowerShell.Exiting 事件似乎永远不会触发,因为我没有放在那里,无论是通常的东西还是测试代码,永远运行。

这是一个已知问题吗?如果是,是否有已知的解决方法或替代方法?

【问题讨论】:

  • 澄清一下:您是否在 ISE 配置文件中添加了代码?请记住,ISE 有一个单独的配置文件(“Microsoft.PowerShellISE_profile.ps1”)
  • 你是如何关闭 ISE 的?您需要在控制台输入 exit 或使用 Alt+F4。当我使用正确的退出方法时,以下内容对我有用。 Register-EngineEvent PowerShell.Exiting -SupportEvent -Action { Start-Process "Notepad.exe" }
  • 是的 - 好吧,我在 CurrentUserAllHosts 配置文件 profile.ps1 中有它。里面还有很多其他的东西,我可以确定它周围的代码都在执行。 get-job 也显示它已注册。
  • 我将您的代码与一个简单的Set-Content -Value "Hi" -Path C:\test.txt 操作放在我的 PowerShellISE 配置文件中,当我正常关闭 ISE(PS3.0) 时它执行良好。
  • 嗯,很有趣。个人资料可能有问题吗?尝试运行 PowerShell_ise.exe -noprofile 然后试试这个。

标签: powershell powershell-ise


【解决方案1】:

嗯,这太奇怪了。

在 Register-EngineEvent 调用之外完全删除配置文件后发现它仍然不起作用,我也开始删除其中的内容,并将配置文件的其余部分恢复到原始状态。以下是我的发现:

如果您有write-host 或其他到 PowerShell 主机的输出,则在 Register-EngineEvent PowerShell.Exited 的脚本块中,当您退出 ISE 时它不会运行(即使它在您退出控制台时工作正常)。

事实上,您针对 PowerShell.Exited 事件注册的 none 个脚本块似乎正在运行,即使是那些不包含任何输出到主机的语句的脚本块。 (这就是为什么当我在上面测试其他人的工作示例时,它们对我不起作用,除非我在没有运行添加现有事件处理程序的配置文件的情况下启动 PowerShell。)

从您与 Register-EngineEvent PowerShell.Exited 一起使用的脚本块中删除所有导致主机输出的语句,或将输出重定向到其他地方,它们都开始工作了。

(把这个和适量的盐一起吃,因为我还没有时间用调试器去追逐它,但我有一个偷偷摸摸的怀疑 ISE 在引擎完成之前关闭它的选项卡......)

【讨论】:

  • 谢谢 - 这有帮助。管道到空值似乎对我启动记事本有用。我希望我可以使用此方法在 ISE 退出时将当前打开的 ISE 选项卡 ($psISE.PowerShellTabs.Files.FullPath) 保存到文件中,但不是写入值,而是使文件空白。我怀疑此时 $psISE 是空的,但我什至无法 Write-Output 输出文件。
  • 我可以使用add-content(或set-content)将内容写入文本文件,但遗憾的是,对$psISE 的任何引用都是空的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多