Process.Start - Pass html code to exe as argument

后端 未结 4 1066
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-19 05:09

I am using the code below to start a executable file from a windows service and I need to pass html code (stored in a variable) as an argument. I am escaping with double quo

相关标签:
4条回答
  • 2021-01-19 05:44

    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.

    0 讨论(0)
  • 2021-01-19 05:49

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

    Becomes

    "SomeSubject" "SomeHTMLVar

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

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

    0 讨论(0)
  • 2021-01-19 05:52

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

    • What is the command line length limit?

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

    0 讨论(0)
  • 2021-01-19 06:06

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

    • Double quotes
    • Carriage returns
    • Line feeds
    0 讨论(0)
提交回复
热议问题