PowerShell:您可以挂钩或拦截PowerShell外部应用程序的执行吗?

时间:2009-02-01 01:21:40

标签: command-line powershell user-interface

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

在我的网络研究中,看起来在$ host中重写NotifyBeginApplication()可能会有所帮助。不幸的是,我无法弄清楚如何做到这一点。

这基本上就是我想做的......

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

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

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

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

如果没有,怎么办呢?

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

2 个答案:

答案 0 :(得分:0)

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

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`"

如果这是您无法修改的代码,那么事情会很复杂。

答案 1 :(得分:-1)

我同意你(不幸)的结论,你需要创建自己的自定义主机来处理这个问题。

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