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

Posted

技术标签:

【中文标题】Process.Start - 将 html 代码作为参数传递给 exe【英文标题】:Process.Start - Pass html code to exe as argument 【发布时间】:2010-04-09 21:24:39 【问题描述】:

我正在使用下面的代码从 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 代码可能很长。我不应该尝试将这么多数据作为参数传递吗?再次感谢您的帮助。

【问题讨论】:

是的,发布 dr["rec"]、htmlVar 和主题的示例值,因为这会产生很大的不同。使用编辑按钮添加您的更改。 【参考方案1】:

您可能需要对以下字符进行编码以使其可在命令行参数中传递:

双引号 回车 换行

【讨论】:

空格也会导致问题。【参考方案2】:

注意不要在命令行传递太多:

What is the command line length limit?

我认为 2000 多个字符开始变得太长了。

【讨论】:

【参考方案3】:

来自 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 121 131", 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 变量中可能存在的字符。

【讨论】:

您传递的是 HTML 还是 URL 并不是 100% 清楚的。如果要传递 HTML,则必须将 htmlvar 用引号括起来。而且,请记住,Process.Start 将像从命令行一样运行此进程。如果引号在命令行中不起作用,则在 Process.Start 中不起作用 也许你意识到了这一点,但发帖人根本没有提到 Internet Explorer。 MyApp.exe 是否可以处理 html,而不是 url/路径,取决于 MyApp.exe 的实现。尽管您可能会向发布者推荐他尝试不同的方法,假设他有能力更改 MyApp.exe 的实现?干杯 @AaronLS:这是从 MSDN 文档中复制/粘贴的,用于演示将变量传递给他的 *.exe。如您所见,您可以从命令行调用:IExplore.exe "C:\myPath\myFile.htm" 而 Process.Start 显然会为您处理路径引用。我的观点是,如果htmlVar 包含引号,那么他依靠 Process.Start 将第二个参数包含在引号中的方法将不起作用。 感谢您的回复。 @AaronLS/@Jim:你们俩都是正确的,因为我已经省略了 htmlVar 的右引号,但是在更正之后,我仍然无法将 html 作为参数传递。即使是像“test”这样的简单字符串也不会正确通过,因为它只是被丢弃了。我尝试使用 String.Replace('"', '\"') 认为是引号导致它失败,但这也无济于事。有什么建议吗?【参考方案4】:

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

变成

"SomeSubject" "SomeHTMLVar

请注意,没有结束引号。也许你想要这个:

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

【讨论】:

以上是关于Process.Start - 将 html 代码作为参数传递给 exe的主要内容,如果未能解决你的问题,请参考以下文章

System.Diagnostics.Process.Start的妙用

当我使用Process.Start运行python程序时,我的python程序中的日志不起作用?

在Winform或WPF中System.Diagnostics.Process.Start的妙用

将 PowerShell 参数传递给 Process.Start

Process.Start() 啥都不做

System.Diagnostics.Process.Start 不能从 IIS 工作