Одиночные кавычки и двойные кавычки: как иметь такое же поведение в 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:'="%