2017-11-13 16 views
3

Was ist der Unterschied zwischen

Write-Host (Get-Date) # just paren 

und

Write-Host $(Get-Date) # dollar-paren 

Inhalt innerhalb der Pars könnte alles sein, nur mit einem einfachen Beispiel gehen. Gibt es einen Unterschied zwischen den beiden?

Ich halte mich mit PS ziemlich vernünftig, aber es sind diese kleinen Dinge, die mich stören, vor allem während Code-Review und dergleichen. Hat jemand eine gute Quelle für "Hier ist, wie die Sprache funktioniert" mit genügend Details gefunden, um Antworten auf diese Art von Fragen abzuleiten?

+1

Sie könnten versuchen, die [PowerShell Language Specification 3.0] (https://www.microsoft.com/en-us/download/details.aspx?id=36389), Abschnitt 7.1.1 Gruppierung von Klammern und Abschnitt 7.1.6 $() operator - Unterausdrücke – TessellatingHeckler

+0

Das ist das Ticket. Danke ... mach das eine Antwort und ich gebe ihr den grünen Scheck. –

Antwort

2

Der Unterausdruck ($(...)) enthält eine StatementBlockAst. Es kann eine beliebige Anzahl von Aussagen nehmen, was bedeutet, Schlüsselwörter (if, foreach, usw.), Pipelines, Befehle usw. Parsing ist ähnlich der im Inneren eines benannten Block wie begin/process/end.

Der paren Ausdruck ((...)) können eine einzelne ExpressionAst enthalten, die eine begrenzte Teilmenge der AST ist. Der wichtigste Unterschied zwischen einer Anweisung und einem Ausdruck besteht darin, dass Schlüsselwörter nicht analysiert werden.

Auch wie andere bemerkt haben, wird der Unterausdruck in doppelt zitierten Strings erweitert.

+0

Markieren Sie dies als "die Antwort"; Der Zeiger auf die Sprachspezifikationsabschnitte von @TesselingHeckler führte mich tatsächlich zu dem tiefen Tauchgang, nach dem ich suchte; Das ist eine gute Zusammenfassung. –

2

Die () mit Reihenfolge der Operationen

Die $() hilft bei der Bewertung Werte innerhalb des heutigen Datum in einer Zeichenfolge zu finden ()

Zum Beispiel, wenn Sie versuchen, hilft Ihnen folgendes tun können:

echo "The length of Bryce is (Get-Date)" 
echo "The length of Bryce is $(Get-Date)" 

Sie werden sehen, dass die Ausgabe unterschiedlich ist (in einem gibt es Ihnen buchstäblich „(Get-Date)“, während in der anderen es Ihnen den ausgewerteten Ausdruck von Get-Date gibt)

Sie können mehr über Syntax Operatoren here

+0

Ich denke, der von Ihnen angegebene Link ist auf der richtigen Spur, aber die Verwendung in Anführungszeichen unterscheidet sich von der Verwendung außerhalb von Anführungszeichen, wie in meiner Frage. Außerdem gefunden und durchsuche ich nun die v 3.0-Sprachspezifikation (hier: https://www.microsoft.com/en-us/download/details.aspx?id=36389), von der ich hoffe, dass sie eine definitive Antwort geben wird. –

+0

Ich habe das Beispiel geändert, um das in der Frage verwendete Cmdlet zu verwenden - ist das näher an dem, wonach Sie suchen? –

+0

Nein, die Verarbeitung von dem, was in den Parens ist, ist in Anführungszeichen anders. Wenn du etwas wie $ x = (Get-Date) oder $ x = $ (Get-Date) gemacht hast, dann 'echo' stuff ... $ x '' würde es mehr im Einklang mit dem sein, was ich aufdecken will , dh PS verarbeitet etwas anderes mit oder ohne $ vor dem Parens. –

2

Parenthesis gelesen werden zu einer Gruppe verwendet und die Ordnung, so wie sie in der Mathematik zu tun. Ab Powershell v3 Sie können sie auch eine Eigenschaft einer Gruppe zu bewerten, verwenden, wie die Dateinamen bekommen für die Dateien im aktuellen Ordner, indem Sie:

(Get-ChildItem).Name 

Ein Unterausdruck $() das Skript innerhalb wertet und stellt dann die Ausgabe des Befehls dar, der im Befehl verwendet werden soll. Oft innerhalb von Strings verwendet, um eine Eigenschaft eines Objekts zu erweitern, wie:

"Hello $($User.Name), would you like to play a game?" 

Es kann auch nützlich sein, wenn mit ComObjects, wie Excel zu arbeiten, wo es eine enorme Auswahl haben, die Sie gegen eine Eigenschaft testen möchten von jeder Gegenstand. Während dies nicht funktioniert, weil die Range Objekt keine Font Eigenschaft hat:

$Range.Font|Where{$_.Bold} 

Dies würde funktionieren, weil es ausgeben würde die Range als eine Sammlung von Cell Objekte, von denen jede eine Font Eigenschaft:

Sie können sich Unterausdrücke als ein Skript innerhalb Ihres Skripts vorstellen, da sie mehrere Befehle lang sein können und die gesamte Sache sofort ausgewertet wird, so dass die Endausgabe für den übergeordneten Befehl verwendet werden kann.