Аргументы командной строки C # и ls - PullRequest
2 голосов
/ 16 марта 2009

Я использую MSYS , чтобы получить некоторое подобие разумной оболочки с поддержкой сценариев в Windows:).

Сейчас я пишу консольное приложение, написанное на C #, которое принимает ряд аргументов и представляет их как параметры пользователю в диалоговом окне. Фактические параметры соответствуют именам файлов, которые я получаю с помощью ls.

Однако проблема возникает, когда у меня есть имена файлов с пробелами в них. Допустим, у меня есть файлы с именем:

file name
with spaces

В каталоге с именем foo мой исполняемый файл C # называется bar, и внутри я проверяю содержимое массива "argv" (т. Е. Аргументы командной строки, передаваемые моему приложению в интерпретации .NET).

Когда я это называю, происходит следующая странность:

. / Bar.exe "имя файла" "с пробелами" ->

file name
with spaces

. / Bar.exe $ (ls foo) ->

file
name
with
spaces

. / Bar.exe $ (ls -Q foo) ->

"file
name"
"with
spaces"

Кто-нибудь знает, что здесь происходит? Очевидно, что .NET неправильно анализирует аргументы, переданные bash или ls.

Но даже когда я добавляю кавычки, кавычки включаются в аргументы вместо объединения двух аргументов в один.

Есть ли какой-нибудь способ для меня получить доступ к необработанной командной строке, чтобы я мог видеть, происходит ли какая-нибудь забавность с управляющими символами или чем-то?

Любое понимание будет с благодарностью!

Ответы [ 3 ]

1 голос
/ 16 марта 2009

Вы можете использовать Environment.CommandLine, чтобы получить исходную команду. Не уверен насчет вещей, извините; возможно, что-то, связанное с окончанием строки (CR против LF против CRLF против LFCR).

0 голосов
/ 03 февраля 2014

Я думаю, проблема в том, что вы передаете параметры в командной строке, а командная строка читает каждое слово как отдельный параметр; Попробуйте сделать «Имя файла» «С пробелами» ..
если вы передаете его через код Используйте

ProcessStartInfo.Arguments = "\"File Name \"" ;

в качестве аргументов вашего процесса

0 голосов
/ 03 февраля 2014

Я использовал это в своем проекте, используя RegawMOD.Android library

Device device = android.GetConnectedDevice(android.ConnectedDevices[0]);

objArray = new object[] { "ls", string.Concat("/sdcard/")) };

str = Adb.ExecuteAdbCommand(Adb.FormAdbCommand(device, "shell", objArray));
// or 
// str= Adb.ExecuteAdbCommand(Adb.FormAdbCommand("shell",objArray));

Для получения дополнительной информации о командах, проверьте это Команды

...