在Powershell中使用另一个cmdlet的参数定义?

und*_*ble 4 powershell

在bash中,我有一堆别名将参数添加到现有程序/函数中,例如:

alias grep='grep --color'
Run Code Online (Sandbox Code Playgroud)

我知道这不是最好的类比,但是在Powershell中有没有简单的方法可以做到这一点?似乎Set-Alias不允许您指定参数。

您可以为cmdlet创建别名,但是不能为包含cmdlet及其参数的命令创建别名。

他们建议创建一个新的cmdlet来执行此操作,但是我希望能够传递其他参数而不必在新cmdlet中对所有允许的参数进行硬编码(例如New-ProxyCommand似乎需要您执行此操作)。这样,我不必知道代理/别名的cmdlet参数何时发生变化,也不必在代理cmdlet中进行更改。

那么什么是最好的解决方案

  • 没有静态复制别名/代理cmdlet的参数定义。让原始cmdlet进行验证或动态引用它。
  • 使用别名/不同名称的cmdlet,因此您必须显式执行某些操作才能获得不同的行为
  • 让别名/新cmdlet将值传递给别名/代理cmdlet中的现有参数

虽然语法可能是错误的,但我能想到的最接近以下内容。似乎也无法在管道系统中发挥最佳效果,但是可以通过某种方式解决。

& $proxiedcommand $additionaldefaultparams $rawparamsfromread-host
Run Code Online (Sandbox Code Playgroud)

还是有一种使用代理cmdlet的东西动态实例化参数的方法,如下所示?

function aliased-cmdlet
{
[CmdletBinding((Get-Command Original-Cmdlet)._cmdletBindingsettings_)]
Param(
(Get-Command Original-Cmdlet)._paramsettings_)
)

Original-Cmdlet -CustomDefault Value -Whatever Else
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*sen 5

如果您要覆盖的唯一更改是默认参数值,则该功能已经内置。使用$PSDefaultParameterValues自动变量:

PS C:\> ('a a a' |Select-String 'a').Matches.Count
1
PS C:\> $PSDefaultParameterValues['Select-String:AllMatches']=$true
PS C:\> ('a a a' |Select-String 'a').Matches.Count
3
Run Code Online (Sandbox Code Playgroud)

如果要在某些情况下覆盖默认参数值,但又不想更改cmdlet的默认行为,请创建一个proxy命令并为proxy命令设置默认值:

# Gather required info
$OriginalCommand = Get-Command Select-String
$NewCommandName = 'Select-AllMatches'
$Metadata = [System.Management.Automation.CommandMetadata]::new($OriginalCommand)

# Create proxy command
$ProxyString = [System.Management.Automation.ProxyCommand]::Create($Metadata)
New-Item -Path function:\ -Name $NewCommandName -Value $ProxyString

# Set default parameter values for proxy command
$PSDefaultParameterValues["$NewCommandName`:AllMatches"] = $true
Run Code Online (Sandbox Code Playgroud)

现在,仅针对Select-AllMatches以下参数覆盖参数默认值:

PS C:\> ('a a a' |Select-String 'a').Matches.Count
1
PS C:\> ('a a a' |Select-AllMatches 'a').Matches.Count
3
Run Code Online (Sandbox Code Playgroud)