Kürzen von Eigenschaftennamen
Leider können Eigenschaften / Methoden (auf die mit einem Punkt zugegriffen wird .
) im Gegensatz zu Parametern normalerweise nicht auf ihre eindeutige Form verkürzt werden.
Bestimmte Cmdlets können jedoch mit Eigenschaftsnamen und Platzhaltern arbeiten, und es gibt wenig bekannte Parametersätze von %
und ?
die können nützlich sein.
Normalerweise übergeben wir einen Skriptblock und verweisen auf das Element mit $_
, aber es gibt auch eine andere Form, die einen Eigenschaftsnamen annimmt und einen Platzhalter akzeptiert.
$o|select Le*
$o|%{$_.Length}
Mit einer Eigenschaft wie der können .Length
wir nicht die v3-Magie verwenden, die normalerweise für ein Array funktioniert, da Length
es sich um eine Eigenschaft des Arrays selbst handelt. Daher können die beiden oben genannten verwendet werden, um die Längen der einzelnen Elemente abzurufen. Das select
kommt etwas kürzer rein.
Aber %
kann einen Eigenschaftsnamen nehmen direkt und zurück , dass Wert:
$a|% Length
Welches kann mit Wildcards gekürzt werden. Der Platzhalter muss in eine einzelne Eigenschaft (oder Methode, dazu später mehr) aufgelöst werden. Andernfalls wird ein hilfreicher Fehler ausgegeben, der genau angibt, für welche Mitglieder er aufgelöst werden könnte.
Im Fall von Length
, Le*
ist in der Regel die kürzeste. Selbst bei einer einzelnen Zeichenfolge ist diese Methode 1 Byte kürzer als die Verwendung der Eigenschaft.
$a.Length # 9 #(doesn't work on array)
$a|%{$_.Length} # 15
$a|% Le* # 8
Aber je nachdem, was Sie damit machen, kann es schlimmer sein. Sie können dies $a.Length*5
nur mit dem Pipeline-Ausdruck tun, den Sie umbrechen müssten ($a|% Le*)*5
. Vielleicht lohnt es sich trotzdem, wenn es gegen ein Array ist, aber der Punkt ist, dass es nicht immer als direkte Substitution geeignet ist.
Es funktioniert auch mit Methoden, und Sie können das weglassen ()
, wodurch ein vollständiger Name dieselbe Länge hat, aber dieselbe Einschränkung wie oben, dass er manchmal umgebrochen werden muss. Die Methode muss eine Überladung haben, die keine Parameter akzeptiert (Sie können Argumente übergeben, indem Sie sie hinter den Methodennamen setzen, was wirklich gut ist):
$a.ToUpper() # 12
$a|% *per # 9
Mit Argumenten:
'gaga'-replace'g','r' # 21
'gaga'|% *ce g r # 16
Dies ist nicht unbedingt dasselbe, da der -replace
Operator einen regulären Ausdruck ersetzt. Wenn Sie jedoch nur einen String ersetzen, kann die Verwendung der Methode (jetzt) kürzer sein. Es ist hilfreich, wenn die Zeichenfolgen Cmdlet-Argumente anstelle von Methodenargumenten sind, sodass sie nicht in Anführungszeichen gesetzt werden müssen.
Where-Object-Eigenschaften
?
kann auch (teilweise) Eigenschaftsnamen annehmen und einen "Operator" darauf anwenden (in Form von Schalterparametern). Dies kann wiederum kürzer sein als die Verwendung des Standard- Where-Object
Scriptblock-Ansatzes, wenn der Eigenschaftsname lang und eindeutig genug ist.
$a|?{$_.Length-gt5} # 19
$a|? Le* -GT 5 # 14
($a|% Le*)-gt5 # 14 - Lengths, not objs