В Windows ситуация немного неприятнее. В принципе, все программы Win32 получают одну длинную строку командной строки - оболочка (обычно cmd.exe
) может сначала выполнить некоторую интерпретацию, например, перераспределение , но не разделить его на границах слов для программы. Каждая программа должна выполнять этот синтаксический анализ (если они того пожелают - некоторые программы не беспокоят). В программах на C и C++ подпрограммы, предоставляемые библиотеками времени выполнения, поставляемыми с инструментальной цепочкой компилятора, обычно выполняют этот этап синтаксического анализа до вызова main()
.
Проблема в том, что в целом вы не знаете, как данная программа будет анализировать свою командную строку. Многие программы скомпилированы с некоторой версией MSVC++, чьи quirky parsing rules are described here, но многие другие компилируются с различными компиляторами, использующими разные соглашения.
Это усугубляется тем фактом, что у cmd.exe
есть свои собственные причудливые правила синтаксического анализа. Каретка (^
) рассматривается как escape-символ, который цитирует следующий символ, а текст внутри двойных кавычек рассматривается как цитируемый, если выполняется список сложных критериев (см. cmd /?
для подробных подробностей). Если ваша команда содержит какие-то странные символы, очень легко понять, какие части текста «процитированы» и которые не должны синхронизироваться с вашей целевой программой, и все ад разрывается.
Таким образом, самый безопасный подход для экранирования аргументы на окнах:
- аргументы Побег в порядке, ожидаемые в командной строке разборе логику программы, которую вы звоните. (Надеюсь, вы знаете, что это за логика, а если нет, попробуйте несколько примеров и догадайтесь.)
- Соедините экранированные аргументы пробелами.
- Префикс каждый не-буквенно-цифровой символ полученной строки с номером
^
.
- Приложите любые переадресации или другие обмороки оболочки (например, соединения команд с
&&
).
- Запустите команду с
system()
или обратными окнами.
Что вы имеете в виду, избежать арг оболочки? Вы имеете в виду поставить перед любыми символами типа «>» или «» или вы хотите включить escaping $, чтобы люди не могли вводить ваши переменные Perl? Или что? Приведите пример того, что вы имеете в виду. –
Как добавить фигурные скобки внутри Системные вызовы .... system ("$ jboss_client/subsystem = logging/size-rotating-file-handler = SAMPLE: добавить \\ (formatter = \ {yyyy \} \\)"); Я всегда получаю выход, как показано ниже. Formatter = yyyy instaed of farmatter = {yyyy}. Можете ли вы дать мне IDEA, чтобы решить эту проблему? –