Запуск сложной командной строки из C#

Я пытаюсь запустить следующую командную строку из С#:

Process.Start("C:\\Program Files\\GoToTags\\GoToTags Encoder\\GoToTags.Encoder.exe --records "{'Url':'http://petshop.intato.com/index.php?id='" + TxtBoxIDCode.Text + "'','RecordType':'Website'}"");

Очевидно, что это не работает.

Проблема в том, что мне нужно сохранить правильные знаки, такие как: чтобы заставить его работать правильно.

Оригинальная команда:

C:\Program Files\GoToTags\GoToTags Encoder\GoToTags.Encoder.exe --records "{'Url':'http://petshop.intato.com/index.php?id=29','RecordType':'Website'}"

Я должен запустить эту команду и в то же время заменить это 29 содержимым текстового поля.

Может ли кто-нибудь помочь мне с этим?


person user1858059    schedule 24.05.2014    source источник


Ответы (3)


Вас ждут несколько ловушек.

Во-первых, как вы уже обнаружили, обратная косая черта в именах путей вызывает проблемы в строках, поскольку они также могут указывать на escape-последовательности C#. Обычно хорошей практикой является использование синтаксиса C# @"..." для имен файлов, отчасти для того, чтобы избежать необходимости удваивать обратную косую черту и облегчить чтение, а отчасти потому, что вы можете непреднамеренно оставить там \t, и это останется незамеченным целую вечность.

Во-вторых, вызов Process.Start с одним параметром принимает только команду — он не может принимать аргументы команды — поэтому вам нужно вызвать перегрузку с двумя параметрами.

В-третьих, кавычки вокруг значения аргумента records нуждаются в обработке, чтобы синтаксис C# знал, что вы хотите от них, т.е. чтобы передать их команде. Я разделил аргументы команды на две части, чтобы было понятнее. Я решил использовать обратную косую черту, чтобы избежать их, хотя использование альтернативы @"...""..." было бы столь же хорошо, и выбор в значительной степени зависит от личных предпочтений, если только контекст не указывает вам явно в одну сторону, а не в другую.

string cmd = @"C:\Program Files\GoToTags\GoToTags Encoder\GoToTags.Encoder.exe";
string url = "http://petshop.intato.com/index.php?id=" + TxtBoxIDCode.Text;
string cmdArgs = "--records \"{'Url':'" + url + "','RecordType':'Website'}\"";
Process.Start(cmd, cmdArgs);

[отредактировано для добавления:]

Если по какой-то причине вы обнаружите, что хотите или нуждаетесь в использовании string.Format для создания своего cmdArgs, вас ждет четвертая ошибка: string.Format ищет фигурные скобки ({ и }) для разграничения спецификаций параметров вставки, но ваш аргумент командной строки records требует фигурных скобок в строке. Чтобы добиться этого, нужно удвоить фигурные скобки, которые вы хотите, например так:

string cmdArgs =
    string.Format("--records \"{{'Url':'{0}','RecordType':'Website'}}\", url)";
person ClickRick    schedule 24.05.2014

Команда string.Format — ваш друг...

string path = @"C:\Program Files\GoToTags\GoToTags Encoder\GoToTags.Encoder.exe";
string args = string.Format("--records \"{'Url':'http://petshop.intato.com/index.php?id={0}','RecordType':'Website'}\"", TxtBoxIDCode.Text);
Process.Start(path, args);
person dbugger    schedule 24.05.2014
comment
Путь содержит пробелы, поэтому его следует заключить в кавычки. - person ClickRick; 24.05.2014
comment
При втором прочтении все еще хуже: Process.Start(string) разрешает только команду, но не разрешает аргументы в этой строке. (Или не соответствует статье MSDN) - person ClickRick; 24.05.2014
comment
вы правы, вам придется использовать переопределение, которое принимает либо две строки, либо информацию о процессе - person dbugger; 24.05.2014