Полезный ответ js2010 является верным в том смысле, что использование Start-Process
является случайным для вашего вопроса и что поведение задает c для CLI * 1007 PowerShell * (powershell.exe
для Windows PowerShell и pwsh
для PowerShell [Core] 6 + ):
Вкл. Windows [1] , есть два уровня оценки для рассмотрения:
(a) Первоначальный синтаксический анализ командной строки в аргументах.
(b) Оценка (с пробелами) результирующие аргументы в качестве кода PowerShell , из-за использования параметра CLI -Command
(-c
).
Re (a) :
Как и большинство консольных программ на Windows, PowerShell распознает только "
символов. (двойные кавычки) - также не '
(одиночные кавычки) - как имеющие функцию syntacti c. [2]
То есть, если только "
символов. экранированы , они строковые разделители , которые сами удалены во время синтаксического анализа.
Как подразумевается выше, '
символов не удалены.
Независимо от того, какие аргументы являются результатом - массив из "
-записанных токенов - объединены с один пробел между ними, который становится входом для (b).
Чтобы объяснить это в контексте вашего примера, с Start-Process
вычеркнуто из рисунка:
Примечание : следующее применяется к вызовам из cmd.exe
или любого контекста, в котором no shell участвует (включая Start-Process
и Windows Запустить ( WinKey-R ) диалоговое окно). В отличие от этого, PowerShell повторно цитирует командную строку за кулисами, чтобы всегда использовать "
, если необходимо.
Другими словами: следующее относится к командным строкам как видно из PowerShell .
Одиночная -цитированная команда:
# Note: This *would* work for calling ping if run from
# (a) PowerShell itself or (b) from a POSIX-like shell such as Bash.
# However, via cmd.exe or any context where *no* shell is involved,
# notably Start-Process and the Windows Run dialog, it does not.
powershell -Command 'ping google.com'
(a ) приводит к тому, что PowerShell находит следующие два дословных аргумента: 'ping
и google.com'
(b) объединяет эти дословные аргументы в форму 'ping google.com'
[2] и выполняет это как код PowerShell , поэтому выводит содержимое этого строкового литерала , ping google.com
Двойная команда в кавычках:
powershell -Command "ping google.com"
(a) приводит к тому, что PowerShell удаляет символы syntacti c "
, находя следующий единый дословный аргумент: ping google.com
(b) затем приводит к тому, что этот дословный аргумент - ping google.com
- выполняется как код PowerShell, который В результате вызывается команда , а именно исполняемый файл ping
с аргументом google.com
.
[1] Вкл Unix Подобно платформам, первый уровень неприменим, потому что вызываемые программы видят только массив из дословно аргументов, а не командную строку, которую они сами должны анализировать в аргументах. Не то чтобы при вызове PowerShell CLI из POSIX-подобной оболочки, такой как bash
на Unix -подобных платформах, именно эта оболочка распознает одинарные кавычки как разделители строк и удаляет их до PowerShell их видит.
[2] Удивительно, но Windows в конечном итоге до каждой отдельной программы может интерпретировать командную строку и некоторые do решили также распознавать '
как разделители строк (например, Ruby). Однако многие программы на Windows, включая сам PowerShell, основаны на среде выполнения C, которая распознает только "
.
[3]. это означает, что нормализация пробелов происходит: то есть
powershell -Command 'ping google.com'
в равной степени приведет к 'ping google.com'
.