У меня есть сценарий foo.cmd
:Отдельные входные параметры запятой?
echo %1 %2
В PowerShell я бегу:
foo.cmd "a,b" "c"
Ожидаемый результат: a,b c
Фактический выход: a b
Почему?
У меня есть сценарий foo.cmd
:Отдельные входные параметры запятой?
echo %1 %2
В PowerShell я бегу:
foo.cmd "a,b" "c"
Ожидаемый результат: a,b c
Фактический выход: a b
Почему?
двойные кавычки удаляются после PowerShell разобран командную строку и передает ее в CMD для исполнения, так CMD на самом деле видит заявление
foo.cmd a,b c
Поскольку запятой одна из CMD-х delimiter characters это утверждение эквивалентно
foo.cmd a b c
Чтобы избежать этого, вам необходимо убедиться, что двойные кавычки сохраняются при передаче аргументов в CMD. Существует несколько способов добиться этого. Например, вы могли бы поставить двойные кавычки аргументов в одинарных qoutes:
foo.cmd '"a,b"' "c"
и изменить позиционные параметры в пакетном сценарии для %~1
, %~2
так, что CMD удаляет двойные кавычки из аргументов.
Если у вас есть PowerShell v3 или более поздней версии, вы можете использовать "magic parameter"--%
, чтобы избежать вложенных цитат:
foo.cmd --% "a,b" "c"
Вам все еще нужно %~1
и %~2
в пакетном сценарии, хотя.
Можете ли вы объяснить, что «PowerShell проанализировал командную строку и передал ее в CMD для выполнения»? Каков именно механизм, который видит, что cmd будет развернут, и обработанная команда передана ему из PowerShell? – igbgotiz
Что нужно объяснить? PowerShell запускает пакетные скрипты с обработчиком, который настроен для пакетных скриптов (как правило, CMD). И он анализирует каждое утверждение, иначе он не сможет расширять переменные, выражения и т. Д. –
Итак, действительно ли PowerShell запускает новый cmd, а cmd запускает «foo.cmd a, b c»? – igbgotiz
Это пример странного поведения, внесенного PowerShell (есть еще один пример [здесь] (http://stackoverflow.com/questions/35313953/findstr-always-fails-to-find-hash-string-in- текстовый файл)). Другими словами: это будет работать так, как ожидалось, в чистом Batch-файле. – Aacini