Синтаксис оператора синтаксиса 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, передаваемый во внешние приложения, довольно запутан.