Парсинг командной строки C# заключенных в кавычки путей и предотвращение символов ESC

У меня была такая же проблема после обновления Xcode до 9.3. Я исправил проблему, просто очистив папку сборки. Вы можете сделать это с помощью Command-Option-Shift-K или в меню параметров «Продукт» -> «Очистить» (см. Скриншот)

You can clean the build folder with Command-Option-Shift-K or in the option menu "Product" -> "Clean"

23
задан James 22 May 2009 в 22:26
поделиться

3 ответа

Не ответ, но вот некоторые предыстория и пояснения Джеффри Тана, Служба поддержки сообщества Microsoft Online (07.12.2006):

Примечание: это не не кодовое поражение но по замыслу, поскольку обратная косая черта обычно используется, чтобы избежать определенных особый персонаж. Кроме того, это алгоритм такой же, как у команды Win32 функция синтаксического анализа строковых аргументов CommandLineToArgvW. См. Примечания раздел ниже: http://msdn2.microsoft.com/en-us/library/bb776391.aspx

Также ссылается на метод FX Environment.GetCommandLineArgs для дальнейшего объяснения поведения обработки косой черты.

Лично я считаю, что это занудство, и удивлен, что меня это не укусило раньше. Или, может быть, я знаю и не знаю? Однако слепая замена кавычек на косые черты не кажется мне решением. Я голосую за этот вопрос, потому что это открыло мне глаза.

9
ответ дан 29 November 2019 в 03:09
поделиться

Мне нравится ваша идея:

_path = args[i].Replace("\"", @"\");

Она чистая и не будет иметь никакого эффекта, если проблема не существует.

1
ответ дан 29 November 2019 в 03:09
поделиться

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

// 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");

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

1
ответ дан 29 November 2019 в 03:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: