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

时间:2017-05-25 13:36:25

标签: powershell

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

alias grep='grep --color'

我知道这不是最好的比喻,但在Powershell中有一个简单的方法吗?好像Set-Alias似乎不允许您指定参数。

  

您可以为cmdlet创建别名,但无法创建别名   对于包含cmdlet及其参数的命令。

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

那么

的最佳解决方案是什么
  • 不静态地复制别名/代理cmdlet的参数定义。让原始cmdlet执行验证或动态引用它。
  • 使用别名/不同名称的cmdlet,因此您必须执行一些明确的操作才能获得不同的行为
  • 让别名/新cmdlet将值传递给别名/代理cmdlet中的现有参数

最近我能想到的是类似下面的内容,尽管语法可能不对。看起来它似乎不会发挥最好的管道,但这可能会以某种方式解决。

& $proxiedcommand $additionaldefaultparams $rawparamsfromread-host

或者有没有办法使用proxy cmdlets的东西动态实例化下面的参数?

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

Original-Cmdlet -CustomDefault Value -Whatever Else
}

1 个答案:

答案 0 :(得分:4)

如果您要覆盖的唯一更改是默认参数值there's already a built-in facility for that。使用$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

如果要在某些实例中覆盖默认参数值,但不更改cmdlet的默认行为,请创建代理命令并为代理命令设置默认值:

# 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

现在仅覆盖Select-AllMatches的参数默认值:

PS C:\> ('a a a' |Select-String 'a').Matches.Count
1
PS C:\> ('a a a' |Select-AllMatches 'a').Matches.Count
3