在PowerShell中编写详细的包装器?

在PowerShell中编写详细的包装器?,powershell,overriding,wrapper,io-redirection,Powershell,Overriding,Wrapper,Io Redirection,我有一个脚本,它使用编写详细的调用。我想创建一个包装器-覆盖它,添加另一个调用,然后调用常规的Write Verbose命令 比如: Function global:Write-Verbose ($msg) { MyLogger $msg Real-Write-Verbose $msg } 我怎么做?可以使用$ExecutionContext.InvokeCommand.GetCommand: function Write-Verbose { [CmdletBindin

我有一个脚本,它使用
编写详细的
调用。我想创建一个包装器-覆盖它,添加另一个调用,然后调用常规的
Write Verbose
命令

比如:

Function global:Write-Verbose ($msg) {
    MyLogger $msg
    Real-Write-Verbose $msg
}

我怎么做?

可以使用
$ExecutionContext.InvokeCommand.GetCommand

function Write-Verbose {
    [CmdletBinding()]
    param(
       [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)]
       [Alias('Msg')]
       [AllowEmptyString()]
       [System.String]
       ${Message})

    begin {
       try {
           $outBuffer = $null
           if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
           {
               $PSBoundParameters['OutBuffer'] = 1
           }
           $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Write-Verbose', [System.Management.Automation.CommandTypes]::Cmdlet)
           $scriptCmd = {& $wrappedCmd @PSBoundParameters }
           $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
           $steppablePipeline.Begin($PSCmdlet)
       } catch {
           throw
       }
    }

    process {
       try {
           MyLogger $Message
           $steppablePipeline.Process($_)
       } catch {
           throw
       }
    }

    end {
       try {
           $steppablePipeline.End()
       } catch {
           throw
       }
    }
}

荣誉归于乔尔Bennett@.

如果您只想在脚本范围内覆盖它(而不是在任何调用的脚本或函数中),可以这样做:

function Private:Write-Verbose ($msg) {
MyLogger $msg
&{Write-Verbose $msg}
}