Leerzeichen zwischen Parametern in einem Powershell-Befehl

Leerzeichen zwischen Parametern in einem Powershell-Befehl

Ich möchte wissen, warum Fehler auftreten, wenn ich in einem Powershell-Befehl Leerzeichen zwischen den Parametern lasse:

MitLeerzeichen: (funktioniert nicht)

wmic desktopmonitor get screenwidth, screenheight
Expression GET non valide.

OhneRaum: (Arbeit)

wmic desktopmonitor get screenwidth,screenheight
ScreenHeight  ScreenWidth

Ist das normal? Ich sehe nämlich im Internet viele Befehle, die mit Leerzeichen eingegeben werden!


Update 27.01.2016 Versionsdetails:

$PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.0.10240.16384
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.42000
BuildVersion                   10.0.10240.16384
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3

Beide Möglichkeiten (mit und ohne Leerzeichen) funktionieren mit CMD, aber nur die zweite Möglichkeit (ohne Leerzeichen) funktioniert mit PowerShell (siehe Screenshots unten):

Cmd.exe

Power Shell

Antwort1

Komma ist ein Array-Operator in PowerShell. Ihr Befehl:

wmic desktopmonitor get screenwidth, screenheight

haben folgende Bedeutung: Aufruf wmicmit drei Argumenten: string desktopmonitor, string getund Array mit zwei Strings screenwidthund screenheight. Da wmices sich um eine native Anwendung handelt, muss PowerShell Argumente in eine Befehlszeile umwandeln. PowerShell verwendet Leerzeichen als Trennzeichen, wenn ein Array in eine Befehlszeile umgewandelt wird. Die resultierende Befehlszeile würde also folgendermaßen aussehen:

wmic desktopmonitor get screenwidth screenheight

Sie können dies sehen, indem Sie den folgenden Befehl eingeben:

cmd /c echo wmic desktopmonitor get screenwidth, screenheight

Ab PowerShell v5 gibt es hier einen Sonderfall. Wenn das Array direkt bereitgestellt wird (nicht als Teilausdruck) und keine Leerzeichen zwischen Kommas und Array-Elementen vorhanden sind, verwendet PowerShell bei der Umwandlung von Arrays in die Befehlszeile Kommas als Trennzeichen.

PS> cmd /c echo 1,2,3 (4,5,6) 7,8 ,9
1,2,3 4 5 6 7 8 9

Dieser Befehl:

wmic desktopmonitor get screenwidth,screenheight

erfüllen diesen Sonderfall und die resultierende Befehlszeile wäre wie folgt:

wmic desktopmonitor get screenwidth,screenheight

verwandte Informationen