Одиночные кавычки и двойные кавычки: как иметь такое же поведение в unix и windows?

1 zoobert [2012-05-24 15:12:00]

У меня есть пакетный скрипт, который вызывает exe с некоторыми параметрами.

В настоящее время я передавал параметры своему exe:

$>my_cmd.exe %*

Один из вариантов программы my_cmd.exe принимает аргументы, которые могут содержать пробелы

$>my_cmd.bat --req "in: lava"  (OK my prog receives in: lava)

$>my_cmd.bat --req 'in: lava'  (NOK my program receives 'in: lava')

Пользователи используют равноценные одинарные кавычки или двойные кавычки.

Он работает с двойными кавычками, потому что их едят на уровне пакетного сценария, но когда они используют '(одинарные кавычки), он остается и передается моей программе.

my_cmd - мультиплатформенный, а в unix - одиночная кавычка и двойная кавычка - специальные символы.

Я хотел бы избежать необходимости делать что-то конкретное в программе my_cmd в зависимости от платформы.

Есть ли способ иметь такое же поведение в сценариях оболочки и пакетных сценариях. Например, пакетный скрипт может содержать одиночную кавычку, если они присутствуют?

Скажите мне, что было бы лучшим решением для вас.

Большое спасибо

windows batch-file


2 ответа


1 Ben Voigt [2012-05-24 20:57:00]

В Windows управление аргументами (и правила для цитирования, глобирования и т.д.) Лежит на приложении. Если ваш код использует что-либо, кроме единственной строки, содержащей все параметры без кавычек, понимайте, что это связано с тем, что ваши средства разработки сделали некоторую предварительную обработку результата GetCommandLine. Поэтому для обработки разных котировок вам необходимо посмотреть на инструменты разработки, а не на ОС. Самый лучший вариант - часто вызывать GetCommandLine самостоятельно и использовать свой выбор библиотеки для ее обработки, а не тот, который предоставляется вашему компилятору.

Тем не менее, команда оболочки Windows предоставила одну из этих библиотек. См. CommandLineToArgvW. Но это не является частью основной ОС, и использование ее полностью необязательно.

Кроме того, пакетный процессор учитывает кавычки при выполнении замены переменных. И это поведение трудно изменить или отключить, но это не похоже, что это источник ваших проблем.


0 panda-34 [2012-05-24 20:25:00]

Почему бы просто не менять котировки вдвое?

set args=%*
my_cmd.exe %args:'="%