Informationen zur Analyse
KURZE BESCHREIBUNG
Beschreibt, wie PowerShell Befehle analysiert.
LANGE BESCHREIBUNG
Wenn Sie an der Eingabeaufforderung einen Befehl eingeben, unterbricht PowerShell den Befehlstext in eine Reihe von Segmenten, die als Token bezeichnet werden, und bestimmt dann, wie die einzelnen Token interpretiert werden.
Wenn Sie beispielsweise Folgendes eingeben:
Write-Host book
PowerShell unterbricht den Befehl in zwei Token Write-Host
und book
und interpretiert jedes Token unabhängig mit einem von zwei Hauptanalysemodi: Ausdrucksmodus und Argumentmodus.
Hinweis
Wenn PowerShell Befehlseingaben analysiert, versucht es, die Befehlsnamen in Cmdlets oder native ausführbare Dateien aufzulösen. Wenn ein Befehlsname keine genaue Übereinstimmung aufweist, wird der Befehl von PowerShell Get-
als Standardverb vorangestellt. PowerShell analysiert Process
beispielsweise als Get-Process
. Es wird aus den folgenden Gründen nicht empfohlen, dieses Feature zu verwenden:
- Es ist ineffizient. Dies führt dazu, dass PowerShell mehrmals durchsucht.
- Externe Programme mit demselben Namen werden zuerst aufgelöst, sodass Sie das gewünschte Cmdlet möglicherweise nicht ausführen.
Get-Help
undGet-Command
keine verbenlosen Namen erkennen.
Ausdrucksmodus
Der Ausdrucksmodus ist für die Kombination von Ausdrücken vorgesehen, die für die Wertbearbeitung in einer Skriptsprache erforderlich sind. Ausdrücke sind Darstellungen von Werten in der PowerShell-Syntax und können einfach oder zusammengesetzt sein, z. B.:
Literale Ausdrücke sind direkte Darstellungen ihrer Werte:
'hello', 32
Variablenausdrücke tragen den Wert der Variablen, auf die sie verweisen:
$x, $script:path
Operatoren kombinieren andere Ausdrücke für die Auswertung:
- 12, -not $Quiet, 3 + 7, $input.Length -gt 1
- Zeichenfolgenliterale müssen in Anführungszeichen enthalten sein.
- Zahlen werden als numerische Werte und nicht als Eine Reihe von Zeichen behandelt (sofern keine Escapezeichen enthalten sind).
- Operatoren, einschließlich unärer Operatoren wie
-
und-not
und binäre Operatoren wie+
und-gt
, werden als Operatoren interpretiert und wenden ihre jeweiligen Vorgänge auf ihre Argumente (Operanden) an. - Attribut- und Konvertierungsausdrücke werden als Ausdrücke analysiert und auf untergeordnete Ausdrücke angewendet, z. B.
[int] '7'
. - Variablenverweise werden auf ihre Werte ausgewertet, aber das Splatting (d. h. das Einfügen vorgefüllter Parametersätze) ist verboten und verursacht einen Parserfehler.
- Alles andere wird als Befehl behandelt, der aufgerufen werden soll.
Argumentmodus
Beim Analysieren versucht PowerShell zunächst, eingaben als Ausdruck zu interpretieren. Wenn jedoch ein Befehlsaufruf auftritt, wird die Analyse im Argumentmodus fortgesetzt.
Der Argumentmodus ist für die Analyse von Argumenten und Parametern für Befehle in einer Shellumgebung konzipiert. Alle Eingaben werden als erweiterbare Zeichenfolge behandelt, es sei denn, sie verwendet eine der folgenden Syntaxen:
- Das Dollarzeichen (
$
) beginnt einen Variablenverweis (nur, wenn ihm ein gültiger Variablenname folgt, andernfalls wird es als Teil der erweiterbaren Zeichenfolge interpretiert). - Anführungszeichen (
'
und"
) beginnen Zeichenfolgenwerte - Klammern (
(
und)
) grenzen neue Ausdrücke ab. - Der Subexpression-Operator (
$(
...)
) grenzt eingebettete Ausdrücke ab. - Klammern (
{
und}
) grenzen neue Skriptblöcke ab. - Initial at sign (
@
) beginnt mit Ausdruckssyntaxen wie Splatting (@args
), Arrays (@(1,2,3)
) und Hashtabellen (@{a=1;b=2}
). - Kommas (
,
) führen Listen ein, die als Arrays übergeben werden, außer wenn der zu aufrufende Befehl eine native Anwendung ist, in diesem Fall werden sie als Teil der erweiterbaren Zeichenfolge interpretiert. Anfängliche, aufeinanderfolgende oder nachfolgende Kommas werden nicht unterstützt.
Werte eingebetteter Ausdrücke werden in Zeichenfolgen konvertiert.
Die folgende Tabelle enthält mehrere Beispiele für Werte, die im Ausdrucks- und Argumentmodus verarbeitet werden, und die Auswertung dieser Werte. Wir gehen davon aus, dass der Wert der Variablen a
ist 4
.
Beispiel | Mode | Ergebnis |
---|---|---|
2 |
Ausdruck | 2 (ganze Zahl) |
`2 |
Ausdruck | "2" (Befehl) |
echo 2 |
Ausdruck | 2 (ganze Zahl) |
2+2 |
Ausdruck | 4 (ganze Zahl) |
echo 2+2 |
Argument | "2+2" (Zeichenfolge) |
echo(2+2) |
Ausdruck | 4 (ganze Zahl) |
$a |
Ausdruck | 4 (ganze Zahl) |
echo $a |
Ausdruck | 4 (ganze Zahl) |
$a+2 |
Ausdruck | 6 (ganze Zahl) |
echo $a+2 |
Argument | 4+2 (Zeichenfolge) |
$- |
Argument | "$-" (Befehl) |
echo $- |
Argument | "$-" (Zeichenfolge) |
a$a |
Ausdruck | "a$a" (Befehl) |
echo a$a |
Argument | "a4" (Zeichenfolge) |
a'$a' |
Ausdruck | "a$a" (Befehl) |
echo a'$a' |
Argument | "a$a" (Zeichenfolge) |
a"$a" |
Ausdruck | "a$a" (Befehl) |
echo a"$a" |
Argument | "a4" (Zeichenfolge) |
a$(2) |
Ausdruck | "a$(2)" (Befehl) |
echo a$(2) |
Argument | "a2" (Zeichenfolge) |
Jedes Token kann als eine Art von Objekttyp interpretiert werden, z. B. Boolean oder Zeichenfolge. PowerShell versucht, den Objekttyp aus dem Ausdruck zu bestimmen. Der Objekttyp hängt vom Typ des Parameters ab, den ein Befehl erwartet, und davon, ob PowerShell weiß, wie das Argument in den richtigen Typ konvertiert werden kann. Die folgende Tabelle enthält mehrere Beispiele für die Typen, die den von den Ausdrücken zurückgegebenen Werten zugewiesen sind.
Beispiel | Mode | Ergebnis |
---|---|---|
Write-Output !1 |
Argument | "!1" (Zeichenfolge) |
Write-Output (!1) |
expression | False (Boolescher Wert) |
Write-Output (2) |
expression | 2 (ganze Zahl) |
Set-Variable AB A,B |
Argument | 'A','B' (Array) |
CMD /CECHO A,B |
Argument | "A,B" (Zeichenfolge) |
CMD /CECHO $AB |
expression | 'A','B' (Array) |
CMD /CECHO :$AB |
Argument | ':A B' (Zeichenfolge) |
Das in PowerShell 3.0 eingeführte Symbol für die Stoppanalyse (--%
) weist PowerShell an, Eingaben nicht als PowerShell-Befehle oder -Ausdrücke zu interpretieren.
Wenn Sie ein ausführbares Programm in PowerShell aufrufen, platzieren Sie das Symbol für die Stoppanalyse vor den Programmargumenten. Diese Technik ist viel einfacher als die Verwendung von Escapezeichen, um Fehlinterpretationen zu verhindern.
Wenn ein Symbol für die Stoppanalyse angezeigt wird, behandelt PowerShell die verbleibenden Zeichen in der Zeile als Literal. Die einzige Interpretation, die ausgeführt wird, besteht darin, Werte für Umgebungsvariablen zu ersetzen, die die Windows-Standardnotation verwenden, z %USERPROFILE%
. B. .
Das Symbol für die Stoppanalyse gilt nur bis zum nächsten Zeilenumbruch- oder Pipelinezeichen. Sie können kein Fortsetzungszeichen (`
) verwenden, um seine Wirkung zu erweitern, oder ein Befehlstrennzeichen (;
) zum Beenden der Auswirkung verwenden.
Der folgende Befehl ruft beispielsweise das Icacls-Programm auf.
icacls X:\VMS /grant Dom\HVAdmin:(CI)(OI)F
Um diesen Befehl in PowerShell 2.0 auszuführen, müssen Sie Escapezeichen verwenden, um zu verhindern, dass PowerShell die Klammern falsch interpretiert.
icacls X:\VMS /grant Dom\HVAdmin:`(CI`)`(OI`)F
Ab PowerShell 3.0 können Sie das Symbol für die Stoppanalyse verwenden.
icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F
PowerShell sendet die folgende Befehlszeichenfolge an das Icacls-Programm :
X:\VMS /grant Dom\HVAdmin:(CI)(OI)F
Hinweis
Das Symbol für die Stoppanalyse, das nur für die Verwendung auf Windows-Plattformen vorgesehen ist.