С# Командная строка Анализ котируемых путей и исключение символов Escape
Как можно анализировать аргументы командной строки, которые должны интерпретироваться как пути? args [] содержит строки, которые автоматически соединяются, если они цитируются, например:
example.exe один два "три четыре"
args[0] = one
args[1] = two
args[2] = three four
Однако, args [] не будет использовать свойство parse "C:\Example \" в качестве аргумента. Скорее, он предоставит аргумент как "C:\Example" "(с добавленной дополнительной цитатой). Это связано с обратным слэшем в пути, который рассматривается как escape-символ, и, таким образом, конечная цитата, которую пользователь поставил в команде -line становится частью аргумента.
.e.g:
example.exe one "C:\InputFolder" "C:\OutuptFolder \"
args[0] = one
args[1] = C:\InputFolder"
args[2] = C:\OutputFolder"
Легкий kludge может быть:
_path = args[i].Replace("\"", @"\");
Однако я уверен, что для этого есть лучшая практика. Как можно правильно проанализировать командную строку, которая включает пути, предотвращая неправильное заполнение массивом args [] укусами, которые были проанализированы для escape-символов?
ПРИМЕЧАНИЕ. Я бы не хотел включать в мой проект всю библиотеку синтаксического анализа командной строки! Мне нужно только обрабатывать цитируемые дорожки и делать это вручную. Пожалуйста, не рекомендуйте NConsoler, Mono или любую другую большую библиотеку синтаксического анализа командной строки "кухонная раковина".
ТАКЖЕ ПРИМЕЧАНИЕ. Насколько я могу судить, это не дублирующий вопрос. В то время как другие вопросы сосредоточены на общем анализе командной строки, этот вопрос специфичен для проблемы, которую вводят пути, когда части их интерпретируются как escape-последовательности.
Ответы
Ответ 1
Не ответ, но здесь некоторые фон и объяснение от Джеффри Тан, поддержка Microsoft Online Community (12/7/2006):
Примечание: это не поражение кода но по дизайну, поскольку backslashe являются обычно используется для особый персонаж. Кроме того, это алгоритм такой же, как и команда Win32 функция анализа аргументов строки CommandLineToArgvW. См. Примечания раздел ниже: http://msdn2.microsoft.com/en-us/library/bb776391.aspx
Также ссылается на метод FX Environment.GetCommandLineArgs для дальнейшего объяснения поведения обработки косой черты.
Лично я думаю, что это перетащить, и я удивлен, что раньше не был до этого. Или, может, я и не знаю? Тем не менее, слепое замещение кавычек косой чертой не влияет на меня. Я голосую за вопрос, потому что это был глазник.
Ответ 2
Мне нравится ваша идея:
_path = args[i].Replace("\"", @"\");
Он чист и не будет иметь эффекта, если проблема не существует.
Ответ 3
У меня было такое же разочарование. Мое решение состояло в том, чтобы использовать регулярные выражения. Мой ожидаемый ввод - это список путей, некоторые из которых могут быть указаны. Вышеупомянутый kludge не работает, если не указаны все последние аргументы.
// Capture quoted string or non-quoted strings followed by whitespace
string exp = @"^(?:""([^""]*)""\s*|([^""\s]+)\s*)+";
Match m = Regex.Match(Environment.CommandLine, exp);
// Expect three Groups
// group[0] = entire match
// group[1] = matches from left capturing group
// group[2] = matches from right capturing group
if (m.Groups.Count < 3)
throw new ArgumentException("A minimum of 2 arguments are required for this program");
// Sort the captures by their original postion
var captures = m.Groups[1].Captures.Cast<Capture>().Concat(
m.Groups[2].Captures.Cast<Capture>()).
OrderBy(x => x.Index).
ToArray();
// captures[0] is the executable file
if (captures.Length < 3)
throw new ArgumentException("A minimum of 2 arguments are required for this program");
Может ли кто-нибудь увидеть более эффективное регулярное выражение?