Process.Start - Pass html code to exe as argument

限于喜欢 提交于 2019-12-01 20:04:13

You may need to encode the following characters to make them passable in a command line argument:

  • Double quotes
  • Carriage returns
  • Line feeds

Be careful not to pass too much on the command-line:

I think 2000+ characters is starting to get too long.

From MSDN documentation: 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");
   }

Edit: AaronLS made it a little more clear as to what you're trying to accomplish. to pass multiple arguments

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

The following methods were taken from the MSDN page for ProcessStartInfo arguments: 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('\\');
        }
    }

That's not the most efficient solution to your problem, but I just copied the code so you could see how to properly escape characters that may be present in your htmlvars variable.

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

Becomes

"SomeSubject" "SomeHTMLVar

Notice there is no closing quote. Maybe you wanted this:

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!