Пробелы между параметрами в команде Powershell

914
noraj

Я хочу знать, почему, когда я пропускаю пробелы между параметрами в команде powershell, у меня возникают ошибки:

С пространством: (не работает)

wmic desktopmonitor get screenwidth, screenheight Expression GET non valide. 

Без места: (работа)

wmic desktopmonitor get screenwidth,screenheight ScreenHeight ScreenWidth 

Это нормально? Потому что я вижу много команд в интернете с пробелами!


Обновление 27/01/2016 Версия Подробнее :

$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  PSRemotingProtocolVersion 2.3 

Оба способа (с пробелом и без него) работают с CMD, но только второй способ (без пробела) работает с PowerShell (см. Снимки экрана ниже):

Cmd.exe

PowerShell

2
Какую версию PowerShell вы используете и в какой версии Windows? Эти команды ОБА действительны в командной строке (не PowerShell в моей настройке), но ОБА недопустимы в моей настройке PowerShell в моей среде. Может быть полезна более подробная информация о конфигурации вашей среды. Если у вас есть возможность добавить снимок экрана или ссылку, показывающую работающий и нерабочий пример, это также может быть полезно. Pimp Juice IT 8 лет назад 1
`$ PSVersionTable` найти версию, которую вы используете. Michael Frank 8 лет назад 0
@ 1Fish_2Fish_RedFish_BlueFish: Жаль, что я не ответил на ваш вопрос в моем обновлении. noraj 8 лет назад 0

1 ответ на вопрос

3
PetSerAl

Запятая является оператором массива в PowerShell. Итак, ваша команда:

wmic desktopmonitor get screenwidth, screenheight 

имеют следующее значение: вызвать wmicс тремя аргументами: строка desktopmonitor, строка getи массив с двумя строками screenwidthи screenheight. Поскольку wmicэто родное приложение, PowerShell должен преобразовывать аргументы в командную строку. PowerShell использует пространство в качестве разделителя при преобразовании массива в командную строку. Итак, полученная командная строка будет следующей:

wmic desktopmonitor get screenwidth screenheight 

Вы можете увидеть это, набрав следующую команду:

cmd /c echo wmic desktopmonitor get screenwidth, screenheight 

Начиная с PowerShell v5, здесь есть один особый случай. Если массив предоставлен напрямую (не как подвыражение) и между запятыми и элементами массива нет пробелов, тогда PowerShell использует запятую в качестве разделителя при преобразовании массивов в командную строку.

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

Эта команда:

wmic desktopmonitor get screenwidth,screenheight 

квалифицироваться для этого особого случая, и полученная командная строка будет следующей:

wmic desktopmonitor get screenwidth,screenheight