Синтаксис оператора синтаксиса PowerShell (&) и двойные кавычки

Может кто-нибудь объяснить мне этот результат? Я потратил много времени на протяжении многих лет, пытаясь освоить синтаксис PowerShell для вызова команд, но это... Я даже не могу угадать, как получить этот результат от ввода.

PS C:\Users\P> & echoargs "   ""1"" 2 3 ""4 5 6""   7 8 9"
Arg 0 is <   1 2 3 4>
Arg 1 is <5>
Arg 2 is <6   7 8 9>

Bueller?

Ответ 1

Двукратные двойные кавычки внутри строки с двумя кавычками - это способ вставки двойной кавычки. Обновленная версия echoargs.exe показывает это немного более четко, поскольку она показывает вам командную строку, используемую для вызова exe:

PS>  echoargs "   ""1"" 2 3 ""4 5 6""   7 8 9"
Arg 0 is <   1 2 3 4>
Arg 1 is <5>
Arg 2 is <6   7 8 9>

Command line:
"C:\...\Modules\Pscx\Apps\EchoArgs.exe"  "   "1" 2 3 "4 5 6"   7 8 9"

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

CMD> EchoArgs.exe "   "1" 2 3 "4 5 6"   7 8 9"
Arg 0 is <   1 2 3 4>
Arg 1 is <5>
Arg 2 is <6   7 8 9>

Command line:
C:\...\Modules\Pscx\Apps\EchoArgs.exe  "   "1" 2 3 "4 5 6"   7 8 9"

Что касается того, почему .NET или код запуска С++ анализирует эту командную строку таким образом, я не совсем уверен. Этот раздел MSDN немного покроет его, и если вы посмотрите на примеры в нижней части темы, вы увидите какое-то одинаково странное поведение синтаксического анализа, например. a\\\b d"e f"g h дает a\\\b, de fg и h.

Ответ 2

Обратите внимание, что Powershell известен некоторыми тяжелыми ошибками, когда речь идет о передаче аргументов приложениям и цитировании указанных аргументов - http://connect.microsoft.com/PowerShell/feedback/details/376207/executing-commands-which-require-quotes-and-variables-is-practically-impossible

Вот как я понимаю, как это происходит (ошибочно):

Строка " ""1"" 2 3 ""4 5 6"" 7 8 9"

Из-за ошибки двойные двойные кавычки, которые становятся буквальной двойной цитатой, никогда не делают этого.

Строка будет похожа на "1" 2 3 "4 5 6" 7 8 9"

Итак, <space>1 2 3 4 становится аргументом, потому что первый раздел с соответствующими кавычками и 4 встречается перед следующим пространством. Тогда пространство и, следовательно, 5 становится вторым аргументом. Тогда пространство, поэтому следующая часть будет отдельным аргументом. Здесь опять же то же правило, что и первый аргумент, за исключением того, что 6 встречается перед цитатой и без пробела и, следовательно, 6 7 8 9 становится следующим аргументом.

Bottomline - аргумент Powershell, передаваемый во внешние приложения, довольно запутан.