问题
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 quotes but this is not working. What do I need to do in order to pass this correctly? Thanks in advance for any guidance that is offered.
Inside the service:
Process.Start(@"E:\Program Files\MyApp.exe", dr["rec"].ToString() +
" \"" + subject + "\" \"" + htmlVar);
and then within MyApp.exe:
static void Main(string[] args)
{
Program MyProg = new Program();
MyProg.MyMeth(args[0].ToString(), args[1].ToString(), args[2].ToString());
}
The exe file is just a simple app that handles the sending of emails. dr["rec"].ToString() is the email address of the recipient. The variable "subject" will contain the subject of the email. The variable "htmlVar" could contain anything, divs, images, hyperlinks, etc.. and the html code could be quite lengthy. Should I not be trying to pass this much data as an argument? Thanks again for the help.
回答1:
You may need to encode the following characters to make them passable in a command line argument:
- Double quotes
- Carriage returns
- Line feeds
回答2:
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.
回答3:
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.
回答4:
" \"" + subject + "\" \"" + htmlVar
Becomes
"SomeSubject" "SomeHTMLVar
Notice there is no closing quote. Maybe you wanted this:
" \"" + subject + "\" \"" + htmlVar + "\""
来源:https://stackoverflow.com/questions/2611044/process-start-pass-html-code-to-exe-as-argument