2017-05-25 66 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'例子讓我覺得你只是想改變默認值。已更新回答 –

相關問題