Command line PowerShell:您能否钩住或拦截外部应用程序的PowerShell执行?

Command line PowerShell:您能否钩住或拦截外部应用程序的PowerShell执行?,command-line,powershell,user-interface,Command Line,Powershell,User Interface,在执行任何外部控制台应用程序(设置一些环境变量)之前,我想做一些整理工作 在我的web研究中,似乎在$host中重写NotifyBeginApplication()就可以做到这一点。不幸的是,我不知道怎么做 这就是我想要做的 $host = $host | ` Add-Member -force -pass -mem scriptmethod NotifyBeginApplication ` { $env:_startTime = [datetime]::now; $env:_lin

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

在我的web研究中,似乎在$host中重写NotifyBeginApplication()就可以做到这一点。不幸的是,我不知道怎么做

这就是我想要做的

$host = $host | `
   Add-Member -force -pass -mem scriptmethod NotifyBeginApplication `
   { $env:_startTime = [datetime]::now; $env:_line = $myInvocation.Line }
这不起作用,因为$host是常量,无论如何它可能是错误的方法

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

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

如果没有,如何做到这一点

我所看到的唯一可行的替代方案是完全实现一个定制PSHost。对于现有可用的源代码,这似乎是可能的,但超出了我想要尝试的范围。

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

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

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


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

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

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

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

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

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

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

PowerShell组可能有机会添加一个钩子,以增加默认控制台的实用性,以用于遗留(也称为大多数)应用程序…?我想在这里发布您的建议:除了即使您实现自己的主机并将其传递到运行空间,也不会调用此方法--更不用说,它没有传递任何值,因此,您对它试图运行的进程一无所知。也许PowerShell组有机会添加一个钩子,以增加默认控制台的实用性,以用于遗留(也称为大多数)应用程序…?我想在这里发表您的建议:除了即使您实现自己的主机并将其传递到运行空间,也不会调用此方法--更不用说,它没有传递给它的值,因此您对它试图运行的进程一无所知。是的,包装单个命令是可能的,特别是对于别名,但不幸的是,问题是“包装”所有外部命令。从v2ctp3开始似乎无法完成。当然可以。除了(1)创建您自己的主机或(2)创建您自己的单点代码外,您无权访问任何单点代码以启动进程。:)是的,可以包装单个命令,特别是使用别名,但是,不幸的是,问题是“包装”所有外部命令。从v2ctp3开始似乎无法完成。当然可以。除了(1)创建您自己的主机或(2)创建您自己的单点代码外,您无权访问任何单点代码以启动进程。:)