Получение необработанной (нерасщепленной) командной строки в .NET

В .NET мы можем легко получить доступ к разделенным аргументам командной строки в строковом массиве из аргументаMain(string[]) или жеEnvironment.GetCommandLineArgs(), Однако есть ли способ получить непарсированную командную строку как одну строку?

Справочная информация: мое приложение добавляет себя в контекстное меню FileExplorer (как это делает Notepad ++). Когда он запускается таким образом, имя файла передается без кавычек, что означает, что если в пути есть пробелы, оно разбивается. Я знаю, что могу это исправить, обняв%1 в кавычках в реестре вродеmyapp.exe "%1", но когда я проверял реестр других приложений, они этого не делали. Они просто какnotepad.exe %1 - они получили полную командную строку. Я хочу знать, возможно ли это в .NET и как.

Ответы на вопрос(2)

необработанную, неизмененную командную строку, вам нужно P / InvokeGetCommandLine из ядра 32 Некоторый разбор будет выполняться операционной системой. Например, перенаправление ввода-вывода, такое как>foo.txt будет исключен из текста командной строки независимо от используемой техники.

Environment.CommandLine может быть достаточным, но имейте в виду, что он удаляет промежуточные пробелы между аргументами (если сам аргумент не заключен в кавычки) и удаляет кавычки из аргументов в кавычках.

Например, для командной строки:

test.exe this is "a test"

Environment.CommandLine равно: & quot;this is a test& Quot;

Но GetCommandLine дает: & Quot;test.exe this is "a test"& Quot; с пробелами и кавычками нетронутыми, вместе с путем exe.

Note что при использовании этой техники вам придется анализировать текст командной строки вручную, что может включать удаление пути к exe-файлу, который может быть заключен в кавычки, если путь содержит пробелы.

 15 сент. 2016 г., 06:35
Вы правы. Оба дают одинаковые результаты в моей текущей настройке системы. Я не отслеживал пример приложения и системы, которые я использовал для проверки этого (это было год назад), но если он когда-либо был сломан, он, должно быть, был из более старой версии OS + .NET + Compiler, чем текущая версия сегодня. Это может относиться только к более старому обновлению VS, например. Не уверен, какие версии. Когда у меня будет шанс, я попытаюсь выяснить, какие версии я использовал. Несмотря на это, вы правы в том, что это не очевидно в текущем программном обеспечении. Может быть, в какой-то момент произошла ошибка? Я не могу сделать вывод, что в какой-то момент это не так. Спасибо.
 13 сент. 2016 г., 14:43
Я также получаю тот же результат отEnvironment.CommandLine как из PInvoke в .NET 4.5.2.
 08 сент. 2016 г., 23:02
Да, не показывай поведение, которое ты описал.Environment.CommandLine соответствуетPInvoke во всех случаях я стараюсь.

Environment.CommandLine

Это лучше сделать до 30 символов.

Ваш ответ на вопрос