Espaços entre parâmetros em um comando Powershell

Espaços entre parâmetros em um comando Powershell

Quero saber por que quando deixo espaços entre os parâmetros em um comando do PowerShell, recebo erros:

Comespaço: (não funciona)

wmic desktopmonitor get screenwidth, screenheight
Expression GET non valide.

Semespaço: (trabalho)

wmic desktopmonitor get screenwidth,screenheight
ScreenHeight  ScreenWidth

Isso é normal? Porque vejo muitos comandos na internet dados com espaços!


Atualização 27/01/2016 Detalhes da versão:

$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

Ambas as formas (com e sem espaço) funcionam com CMD, mas apenas a segunda forma (sem espaço) funciona com PowerShell (veja as capturas de tela abaixo):

cmd.exe

PowerShell

Responder1

Vírgula é um operador de array no PowerShell. Então seu comando:

wmic desktopmonitor get screenwidth, screenheight

têm o seguinte significado: invocar wmiccom três argumentos: string desktopmonitor, string gete array com duas strings screenwidthe screenheight. Por wmicser um aplicativo nativo, o PowerShell precisa transformar argumentos em linha de comando. O PowerShell usa espaço como separador ao transformar o array em linha de comando. Portanto, a linha de comando resultante seria a seguinte:

wmic desktopmonitor get screenwidth screenheight

Você pode ver isso digitando o seguinte comando:

cmd /c echo wmic desktopmonitor get screenwidth, screenheight

A partir do PowerShell v5, há um caso especial aqui. Se a matriz for fornecida diretamente (não como subexpressão) e não houver espaços entre vírgulas e elementos da matriz, o PowerShell usará vírgula como separador ao transformar matrizes em linha de comando.

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

Este comando:

wmic desktopmonitor get screenwidth,screenheight

qualificar-se para este caso especial e a linha de comando resultante seria a seguinte:

wmic desktopmonitor get screenwidth,screenheight

informação relacionada