О черт. Это все ... Эхх. Но это законно официально. Из Microsoft в C # для .NET Core, может быть, только для Windows, может быть кроссплатформенным, но MIT лицензирован.
Выберите лакомые кусочки, объявления методов и заметные комментарии;
internal static unsafe string[] InternalCreateCommandLine(bool includeArg0)
private static unsafe int SegmentCommandLine(char * pCmdLine, string[] argArray, bool includeArg0)
private static unsafe int ScanArgument0(ref char* psrc, char[] arg)
private static unsafe int ScanArgument(ref char* psrc, ref bool inquote, char[] arg)
-
// First, parse the program name (argv[0]). Argv[0] is parsed under special rules. Anything up to
// the first whitespace outside a quoted subtring is accepted. Backslashes are treated as normal
// characters.
-
// Rules: 2N backslashes + " ==> N backslashes and begin/end quote
// 2N+1 backslashes + " ==> N backslashes + literal "
// N backslashes ==> N backslashes
Это код, портированный на .NET Core из .NET Framework, который, как я полагаю, является либо библиотекой MSVC C, либо CommandLineToArgvW
.
Вот моя нерешительная попытка обработать некоторые из махинаций с помощью регулярных выражений и игнорировать нулевой бит аргумента. Это немного волшебство.
private static readonly Regex RxWinArgs
= new Regex("([^\\s\"]+\"|((?<=\\s|^)(?!\"\"(?!\"))\")+)(\"\"|.*?)*\"[^\\s\"]*|[^\\s]+",
RegexOptions.Compiled
| RegexOptions.Singleline
| RegexOptions.ExplicitCapture
| RegexOptions.CultureInvariant);
internal static IEnumerable<string> ParseArgumentsWindows(string args) {
var match = RxWinArgs.Match(args);
while (match.Success) {
yield return match.Value;
match = match.NextMatch();
}
}
Протестировал его на сумасшедшем сгенерированном выходе. Его вывод соответствует значительному проценту от того, что набрали обезьяны и набрали CommandLineToArgvW
.