【问题标题】:PowerShell: Can you hook or intercept PowerShell execution of external applications?PowerShell:你能挂钩或拦截外部应用程序的 PowerShell 执行吗?
【发布时间】:2010-10-04 17:44:35
【问题描述】:

我想在执行任何外部控制台应用程序(设置一些环境变量)之前做一些整理工作。

在我的网络研究中,在 $host 中覆盖 NotifyBeginApplication() 似乎可以解决问题。不幸的是,我不知道该怎么做。

这就是我想要做的事情......

$host = $host | `
   Add-Member -force -pass -mem scriptmethod NotifyBeginApplication `
   { $env:_startTime = [datetime]::now; $env:_line = $myInvocation.Line }

这不起作用,因为 $host 是常量,而且无论如何它可能是错误的方法。

我能够找到的文档指出,在执行任何“旧”控制台应用程序之前调用此函数,但另一个博客条目说它仅在没有 I/O 重定向的控制台应用程序中调用。

那么,这是正确的方法吗?如果是这样,我将如何覆盖该函数?

如果不是,那怎么办?

我见过的唯一可行的方法是完全实现自定义 PSHost。使用现有的可用源代码,这似乎是可能的,但超出了我想要尝试的范围。

【问题讨论】:

    标签: command-line powershell user-interface


    【解决方案1】:

    如果这是您可以修改的代码,则创建此函数:

    Function call {
        ## Set environment here
        $env:FOO = "BAR"
        Invoke-Expression "$args"
    }
    

    现在将您的本机命令传递给调用函数。例子:

    call cmd /c set
    call cmd /c dir
    call somefunkyexe /blah -ooo aaah -some:`"Funky Argument`"
    

    如果这是你无法修改的代码,那么事情就会变得复杂。

    【讨论】:

    • 是的,包装单个命令是可能的,尤其是使用别名,但不幸的是,问题在于“包装”ALL 外部命令。从 v2ctp3 开始似乎无法完成。
    • 嗯,当然。除非您 (1) 创建自己的主机,或 (2) 创建自己的单点代码,否则您无法访问任何单点代码来启动进程。 :)
    【解决方案2】:

    我也同意您的(不幸的)结论,即您需要创建自己的自定义主机来处理此问题。

    您可以通过脚本轻松创建额外的运行空间,但在您当前运行的主机(默认控制台)中无法访问此方法。

    【讨论】:

    • 也许 PowerShell 小组有机会添加一个钩子来增加默认控制台的实用性,以便与旧版(也称为大多数)应用程序一起使用...?
    • 我会在这里发表你的建议:connect.microsoft.com/site/sitehome.aspx?SiteID=99
    • 除了即使您实现自己的主机并将其传递给运行空间,此方法也不会被调用——更不用说,它没有传递任何值,所以您不会无论如何都知道它试图运行的进程。
    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2011-04-10
    相关资源
    最近更新 更多