2016-02-24 4 views
0

У меня есть сценарий foo.cmd:Отдельные входные параметры запятой?

echo %1 %2 

В PowerShell я бегу:

foo.cmd "a,b" "c" 

Ожидаемый результат: a,b c
Фактический выход: a b

Почему?

+0

Это пример странного поведения, внесенного PowerShell (есть еще один пример [здесь] (http://stackoverflow.com/questions/35313953/findstr-always-fails-to-find-hash-string-in- текстовый файл)). Другими словами: это будет работать так, как ожидалось, в чистом Batch-файле. – Aacini

ответ

0

двойные кавычки удаляются после 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 в пакетном сценарии, хотя.

+0

Можете ли вы объяснить, что «PowerShell проанализировал командную строку и передал ее в CMD для выполнения»? Каков именно механизм, который видит, что cmd будет развернут, и обработанная команда передана ему из PowerShell? – igbgotiz

+0

Что нужно объяснить? PowerShell запускает пакетные скрипты с обработчиком, который настроен для пакетных скриптов (как правило, CMD). И он анализирует каждое утверждение, иначе он не сможет расширять переменные, выражения и т. Д. –

+0

Итак, действительно ли PowerShell запускает новый cmd, а cmd запускает «foo.cmd a, b c»? – igbgotiz