Process.Start - передает HTML-код exe в качестве аргумента. - PullRequest
4 голосов
/ 10 апреля 2010

Я использую приведенный ниже код для запуска исполняемого файла из службы Windows, и мне нужно передать HTML-код (хранится в переменной) в качестве аргумента. Я убегаю с двойными кавычками, но это не работает. Что мне нужно сделать, чтобы пройти это правильно? Заранее благодарим за любые рекомендации, которые предлагаются.

Внутри службы:

Process.Start(@"E:\Program Files\MyApp.exe", dr["rec"].ToString() +
                                  " \"" + subject + "\" \"" + htmlVar);

, а затем в MyApp.exe:

static void Main(string[] args)
{
    Program MyProg = new Program();
    MyProg.MyMeth(args[0].ToString(), args[1].ToString(), args[2].ToString());
}

EXE-файл - это простое приложение, которое обрабатывает отправку электронных писем. dr ["rec"]. ToString () - адрес электронной почты получателя. Переменная «тема» будет содержать тему письма. Переменная "htmlVar" может содержать что угодно, элементы div, изображения, гиперссылки и т. Д., А код html может быть довольно длинным. Разве я не должен пытаться передать столько данных в качестве аргумента? Еще раз спасибо за помощь.

Ответы [ 4 ]

5 голосов
/ 10 апреля 2010

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

  • Двойные кавычки
  • Возврат каретки
  • Перевод строки
4 голосов
/ 10 апреля 2010

Будьте осторожны, чтобы не передавать слишком много в командной строке:

Я думаю, что 2000+ персонажей начинают становиться слишком длинными.

2 голосов
/ 10 апреля 2010

Из документации MSDN: http://msdn.microsoft.com/en-us/library/h6ak8zt5.aspx

  // Opens urls and .html documents using Internet Explorer.
   void OpenWithArguments()
   {
      // url's are not considered documents. They can only be opened
      // by passing them as arguments.
      Process.Start("IExplore.exe", "www.northwindtraders.com");

      // Start a Web page using a browser associated with .html and .asp files.
      Process.Start("IExplore.exe", "C:\\myPath\\myFile.htm");
      Process.Start("IExplore.exe", "C:\\myPath\\myFile.asp");
   }

Редактировать: AaronLS прояснил немного, что вы пытаетесь достичь. передать несколько аргументов

Process myProcess = new Process();
string arg = String.Format("{0} {1}{2}{1} {1}{3}{1}", dr["rec"], '"',htmlVar); 
myProcess.StartInfo.FileName = @"E:\Program Files\MyApp.exe";
myProcess.StartInfo.Arguments = ArgvToCommandLine(new string[] { arg });

myProcess.Start();

Следующие методы были взяты со страницы MSDN для аргументов ProcessStartInfo: http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.arguments.aspx

 public static string ArgvToCommandLine(IEnumerable<string> args)
    {
        StringBuilder sb = new StringBuilder();
        foreach (string s in args)
        {
            sb.Append('"');
            // Escape double quotes (") and backslashes (\).
            int searchIndex = 0;
            while (true)
            {
                // Put this test first to support zero length strings.
                if (searchIndex >= s.Length)
                {
                    break;
                }
                int quoteIndex = s.IndexOf('"', searchIndex);
                if (quoteIndex < 0)
                {
                    break;
                }
                sb.Append(s, searchIndex, quoteIndex - searchIndex);
                EscapeBackslashes(sb, s, quoteIndex - 1);
                sb.Append('\\');
                sb.Append('"');
                searchIndex = quoteIndex + 1;
            }
            sb.Append(s, searchIndex, s.Length - searchIndex);
            EscapeBackslashes(sb, s, s.Length - 1);
            sb.Append(@""" ");
        }
        return sb.ToString(0, Math.Max(0, sb.Length - 1));
    }
    private static void EscapeBackslashes(StringBuilder sb, string s, int lastSearchIndex)
    {
        // Backslashes must be escaped if and only if they precede a double quote.
        for (int i = lastSearchIndex; i >= 0; i--)
        {
            if (s[i] != '\\')
            {
                break;
            }
            sb.Append('\\');
        }
    }

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

1 голос
/ 10 апреля 2010

" \"" + subject + "\" \"" + htmlVar

Становится

"SomeSubject" "SomeHTMLVar

Обратите внимание, что нет закрывающей кавычки. Может быть, вы хотели это:

" \"" + subject + "\" \"" + htmlVar + "\""

...