Process.Start - 将html代码传递给exe作为参数

时间:2010-04-09 21:24:40

标签: c# argument-passing

我使用下面的代码从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()是收件人的电子邮件地址。变量“subject”将包含电子邮件的主题。变量“htmlVar”可以包含任何东西,div,图像,超链接等等。而html代码可能非常冗长。我不应该试图将这么多数据作为论据传递吗?再次感谢您的帮助。

4 个答案:

答案 0 :(得分:5)

您可能需要对以下字符进行编码,以使它们在命令行参数中可以通过:

  • 双引号
  • 回车
  • 换行

答案 1 :(得分:4)

小心不要在命令行上传递太多:

我认为2000多个角色开始变得太长了。

答案 2 :(得分:2)

来自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();

以下方法取自ProcessStartInfo参数的MSDN页面: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变量中可能存在的字符。

答案 3 :(得分:1)

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

变为

"SomeSubject" "SomeHTMLVar

请注意,没有收盘报价。也许你想要这个:

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