Espacios entre parámetros en un comando de Powershell

Espacios entre parámetros en un comando de Powershell

Quiero saber por qué cuando dejo espacios entre parámetros en un comando de PowerShell tengo errores:

Conespacio: (no funciona)

wmic desktopmonitor get screenwidth, screenheight
Expression GET non valide.

Sinespacio: (trabajo)

wmic desktopmonitor get screenwidth,screenheight
ScreenHeight  ScreenWidth

Eso es normal ? ¡Porque veo muchos comandos en Internet con espacios!


Actualización 27/01/2016 Detalle de la versión:

$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 formas (con y sin espacio) funcionan con CMD, pero solo la segunda forma (sin espacio) funciona con PowerShell (ver capturas de pantalla a continuación):

cmd.exe

Potencia Shell

Respuesta1

Comma es un operador de matriz en PowerShell. Entonces tu comando:

wmic desktopmonitor get screenwidth, screenheight

tiene el siguiente significado: invocar wmiccon tres argumentos: cadena desktopmonitor, cadena gety matriz con dos cadenas screenwidthy screenheight. Como wmices una aplicación nativa, PowerShell tiene que transformar los argumentos en una línea de comando. PowerShell usa espacio como separador al transformar una matriz en una línea de comando. Entonces, la línea de comando resultante sería la siguiente:

wmic desktopmonitor get screenwidth screenheight

Puedes ver eso escribiendo el siguiente comando:

cmd /c echo wmic desktopmonitor get screenwidth, screenheight

A partir de PowerShell v5 hay un caso especial. Si la matriz se proporciona directamente (no como subexpresión) y no hay espacios entre comas y elementos de la matriz, entonces PowerShell usa la coma como separador al transformar las matrices en una línea 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

califica para este caso especial y la línea de comando resultante sería la siguiente:

wmic desktopmonitor get screenwidth,screenheight

información relacionada