Струнная помощь! Процесс не запускается, возможно, потому что строка аргумента запуталась - PullRequest
0 голосов
/ 09 июня 2010

У меня есть следующий код:

ProcessStartInfo si = new ProcessStartInfo("./Resources/pdftk.exe", executionstring);
Process myproc = Process.Start(si);

В моем окне просмотра во время отладки я вижу следующее:

альтернативный текст http://img529.imageshack.us/img529/174/watchn.png

Что бы я хотелна самом деле введите в командной строке:

pdftk.exe "C:\test.pdf" unpack_files output "C:\TEMP" dont_ask

Однако я думаю, что где-то там процесс не запускается с правильными аргументами и, следовательно, не выполняет свою работу.Есть предложения?

Ответы [ 4 ]

0 голосов
/ 09 июня 2010

Взгляните туда: Строковые литералы

string a = "hello, world";                  // hello, world
string b = @"hello, world";               // hello, world
string c = "hello \t world";               // hello     world
string d = @"hello \t world";               // hello \t world
string e = "Joe said \"Hello\" to me";      // Joe said "Hello" to me
string f = @"Joe said ""Hello"" to me";   // Joe said "Hello" to me
string g = "\\\\server\\share\\file.txt";   // \\server\share\file.txt
string h = @"\\server\share\file.txt";      // \\server\share\file.txt
0 голосов
/ 09 июня 2010

Я получил это работает.В итоге я поместил свою строку в буфер обмена, скопировал ее в блокнот и затем проанализировал, правильно ли она:

Clipboard.SetText(executionstring);

Моя проблема сводилась к тому, что аргументы для pdftk.exe формировались неправильно.

0 голосов
/ 09 июня 2010

Вы, вероятно, создали свою строку выполнения с неправильным использованием обратной косой черты.Важно, чтобы вы понимали, как работает обратная косая черта.Примите следующее утверждение:

strcpy(buffer,"c:\tools");

Если вы исследуете значение буфера в отладчике, вы увидите что-то вроде этого:

C:<tab>ools

(вероятно, будет заменено некоторыми визуальными пробелами иливообще ничего)Это потому, что \ t переводится компилятором в символ табуляции.

Чтобы получить правильный буфер, вы должны записать это

strcpy(buffer,"c:\\tools");

Первый обратный слеш экранирует второй, заканчиваятолько с 1 обратной косой чертой.

Однако, если вы создадите свой буфер следующим образом:

buffer[0] = 'c';
buffer[1] = ':';
buffer[2] = '\\';
buffer[3] = '\\';
buffer[4] = 't';
...

Тогда буфер будет таким:

c:\\tools

И будетна самом деле содержит 2 обратных слеша.

Это потому, что обратный слэш интерпретируется компилятором, а не временем выполнения.

Заключение: осознайте, что обратный слеш интерпретируется компилятором, и только если вы используете обратный слешпостоянные строки или постоянные символы, они интерпретируются.Если вы строите строки динамически, нет необходимости использовать 2 обратных слеша.

0 голосов
/ 09 июня 2010

Отладчик показывает вам строку с экранированными символами, это артефакт отладчика Visual Studio.

Например, \"C:\\test.pdf\" - это строка, содержащая "C:\test.pdf"

Фактическая строкаПередача выполняется именно так, как вы этого хотите, поэтому проблема кроется в другом месте.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...