4

以下のコードを使用して、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 コードは非常に長くなる可能性があります。これほど多くのデータを引数として渡そうとするべきではありませんか? 助けてくれてありがとう。

4

4 に答える 4

5

コマンドライン引数で渡せるようにするには、次の文字をエンコードする必要がある場合があります。

  • 二重引用符
  • キャリッジリターン
  • 改行
于 2010-04-09T21:27:15.970 に答える
4

コマンドラインで渡しすぎないように注意してください。

2000以上の文字が長くなり始めていると思います.

于 2010-04-09T22:04:18.580 に答える
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 変数に存在する可能性のある文字を適切にエスケープする方法を確認できるように、コードをコピーしただけです。

于 2010-04-09T21:31:56.530 に答える
0

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

なる

"SomeSubject" "SomeHTMLVar

締めくくりの引用がないことに注意してください。多分あなたはこれが欲しかった:

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

于 2010-04-09T21:34:21.350 に答える