2017-05-25 5 views
2

In bash, habe ich eine Reihe von Aliasnamen, die Parameter für die bestehenden Programme/Funktionen hinzufügen, zum Beispiel:Verwenden Sie die Parameterdefinition eines anderen Cmdlet in Powershell?

alias grep='grep --color' 

Ich weiß, das ist nicht die beste Analogie, aber gibt es eine einfache Möglichkeit, dass in Powershell zu tun? Es scheint wie Set-Alias lässt Sie Parameter nicht angeben.

Sie können einen Alias ​​für ein Cmdlet erstellen, aber Sie können nicht einen Alias ​​ für einen Befehl erstellen, die eines Cmdlets und seine Parameter besteht.

Sie schlagen vor, eine neue Cmdlets zu schaffen, dies zu tun, aber ich würde es vorziehen, der Lage sein, zusätzliche Parameter zu übergeben, ohne alle erlaubt params im neuen Cmdlets zu codieren, die (wie New-Proxycommand Sie zu benötigen scheint machen). Auf diese Weise muss ich nicht wissen, wann die Cmdlet-Parameter "proxied/aliased" geändert und in meinem Proxy-Cmdlet geändert werden. So

was ist die beste Lösung für

  • nicht statisch die Parameterdefinition für die aliased/proxied Cmdlets duplizieren. Lassen Sie das ursprüngliche Cmdlet die Validierung durchführen oder verweisen Sie dynamisch darauf.
  • ein Alias ​​/ anders genannt Cmdlets verwenden, so dass Sie etwas explizit zu bekommen, das unterschiedliche Verhalten
  • die Alias ​​/ neue Cmdlets Pass Werte zu tun haben, müssen vorhandene Parameter in dem aliased/proxied Cmdlets

Closest I kann sich vorstellen, ist etwas wie das unten, obwohl Syntax wahrscheinlich falsch ist. Auch scheint es mit Piping nicht am nettesten zu spielen, aber das kann wohl irgendwie umgangen werden.

& $proxiedcommand $additionaldefaultparams $rawparamsfromread-host 

Oder gibt es eine Möglichkeit, die Dinge für proxy cmdlets zu verwenden, um dynamisch wie unter Parameter zu instanziiert?

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

Original-Cmdlet -CustomDefault Value -Whatever Else 
} 
+1

Dies [Beispiel von Jeff Hicks] (https://mcpmag.com/articles/2013/11/05/blacksmith-part-7.aspx) oder diese [Walkthrough von Don Jones] (http://windowsitpro.com/blog/powershell-proxy-functions) von Proxy-Funktionen könnte helfen – BenH

+0

Sie könnten in Erwägung ziehen, ein Scriptlet (Skriptfunktion) zu schreiben, das '$ myinvocation', speziell' $ myinvocation.line', verwendet und es nach beliebigen Parametern parsiert wurden geliefert, die Sie ändern oder überschreiben müssen. Siehe beispielsweise [diese MSDN-Seite unter "Alle Parameter abrufen"] (https://blogs.msdn.microsoft.com/powershell/2007/05/31/bekommen-all-your-parameters /) –

+0

@BenH, habe ich meine Frage ein wenig aktualisiert. Ich denke, dass der Proxy-Befehl nahe kommt, aber nicht behandelt, dass die Parameter alt werden. Es scheint, als wäre die Lösung, mehr Meta zu bekommen und die Proxy-Cmdlet-Generierung dynamisch durchzuführen. Scheint ein wenig überentwickelt und zerbrechlich für das, was ich fühle, sollte eine einfache Lösung sein. – undefinedvariable

Antwort

3

Wenn die einzige Änderung, die Sie außer Kraft setzen möchten ein Standardparameterwert ist, there's already a built-in facility for that. Verwenden Sie die $PSDefaultParameterValues automatische Variable:

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 

Wenn Sie Standard-Parameterwerte in einigen Fällen außer Kraft setzen möchten, aber nicht das Standardverhalten des Cmdlets ändern, erstellen Sie einen Proxy-Befehl und Standardwerte für den Proxy-Befehl :

# 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 

Nun wird der Parameter Standardwert nur für Select-AllMatches außer Kraft gesetzt:

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

Danke, dass du das gemacht hast. Ich denke, ich könnte das für diesen spezifischen Anwendungsfall, den ich im Sinn habe, verwenden. Die Anforderung, den Parameter mit einem Cmdlet-Namen zu verknüpfen und global für eine Sitzung festzulegen, scheint jedoch ein wenig einschränkend zu sein. Das scheint nicht die kompatibelste zu sein, wenn ich zwei Aliasnamen haben möchte, die unterschiedliche Parameter oder unterschiedliche Werte für denselben Parameter festlegen. – undefinedvariable

+0

Es bedeutet auch, dass ich von Benutzern verlangen müsste, etwas explizit zu tun, um das ursprüngliche Cmdlet ohne die benutzerdefinierten Standardwerte aufzurufen. Aus diesem Grund wird ein Alias ​​bevorzugt, sodass das Standardverhalten für das ursprüngliche Cmdlet nicht geändert wird. – undefinedvariable

+0

@undefinedvariable Entschuldigung, das 'grep -> grep' Beispiel hat mich glauben lassen, dass du nur die Standardeinstellungen ändern willst. Aktualisierte Antwort –

Verwandte Themen