2017-05-25 60 views
2

在bash,我有一堆参数添加到现有的程序/功能,例如别名:在powershell中使用另一个cmdlet的参数定义?

alias grep='grep --color' 

我知道这不是最好的比喻,但有一个简单的方法来做到这一点在PowerShell中?好像Set-Alias不让你指定参数。

您可以为cmdlet创建别名,但不能为由cmdlet及其参数组成的命令创建别名 。

他们建议创建一个新的cmdlet来这样做,但我宁愿能够通过额外的参数,而无需硬编码在所有新的cmdlet中允许PARAMS(像新ProxyCommand似乎需要你做)。这样,我不必知道代理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

这个[Jeff Hicks的例子](https://mcpmag.com/articles/2013/11/05/blacksmith-part-7.aspx)或者这个[Don Jones的漫游](http://windowsitpro.com/blog/powershell-proxy-functions)可能有帮助 – BenH

+0

您可能需要考虑编写一个使用'$ myinvocation',特别是'$ myinvocation.line'的scriptlet(脚本函数),并解析其中的任何参数已提供,您需要修改或覆盖。例如,请参阅[关于“获取所有参数”的MSDN页面](https://blogs.msdn.microsoft。com/powershell/2007/05/31/getting-all-your-parameters /) –

+0

@BenH,我稍微更新了我的问题。我认为代理人命令已经接近尾声,但并没有解决参数变得过时的问题。看起来解决方案是获取更多元数据并动态执行代理cmdlet生成。似乎有点过度设计和脆弱,我觉得应该是一个简单的解决方案。 – undefinedvariable

回答

3

如果您要覆盖的唯一更改是默认参数值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]::($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 
+0

感谢您的支持。我想我可能会将它用于我想到的这个特定用例。将参数绑定到cmdlet名称并将其设置为全局会话的要求似乎有点受限。如果我想要两个别名为同一参数设置不同的参数或不同的值,那么这似乎不是最兼容的。 – undefinedvariable

+0

此外,这意味着我会要求用户明确地执行某些操作,以调用原始cmdlet而不使用自定义默认值。这就是为什么首选别名的原因,以便原始cmdlet的默认行为不会更改。 – undefinedvariable

+0

@undefinedvariable对不起,'grep - > grep'例子让我觉得你只是想改变默认值。已更新回答 –

相关问题