Синтаксис оператора вызова (&) PowerShell и двойные кавычки - PullRequest
11 голосов
/ 18 января 2012

Может кто-нибудь объяснить мне этот результат? Я потратил много времени за годы, пытаясь освоить синтаксис 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

Ответы [ 2 ]

4 голосов
/ 18 января 2012

Двойные кавычки в двойных кавычках - это способ вставить двойные кавычки.Обновленная версия 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 или код запуска C ++ анализирует командную строку таким образом, я не совсем уверен.В этой теме MSDN она немного освещена, и если вы посмотрите на примеры в нижней части темы, вы увидите не менее странное поведение при разборе, например a\\\b d"e f"g h дает a\\\b, de fg и h.

3 голосов
/ 18 января 2012

Обратите внимание, что 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 во внешние приложения довольно запутана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...