Подтвердить что ты не робот

С# Командная строка Анализ котируемых путей и исключение символов 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-последовательности.

4b9b3361

Ответ 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");

Может ли кто-нибудь увидеть более эффективное регулярное выражение?