QA@IT

C#で外部アプリ起動時に引数として空文字を設定する場合

55000 PV

C#で外部アプリ起動時に引数として空文字を設定する方法を探しています。

例として、以下「sample.exe」を起動する際、「1 2 3 (空文字)」の4つの引数を設定したいのですが、以下のコードを実行しても引数が3つまでしか認識されません。

System.Diagnostics.ProcessStartInfo psi =
    new System.Diagnostics.ProcessStartInfo();
psi.FileName = @"c:\sample.exe";
psi.Arguments = @"1 2 3 """;
System.Diagnostics.Process.Start(psi);

引数に空文字を設定するにはどうすればいいのでしょうか。

よろしくお願いいたします。
開発環境はVS2013Professionalです。

【2018/02/14 20:40 追記】

コマンドラインから実行する場合、
>sample.exe 1 2 3 "
または
>sample.exe 1 2 3 ""
と同様の結果にしたいと考えています。

【2018/02/14 21:09 追記】

・タイトル変更
C#で外部アプリ起動時に引数として空白を設定する場合
→C#で外部アプリ起動時に引数として空文字を設定する場合

そもそも引数として空白ではなく、空文字(文字列0)を設定する必要があるのではないかと判明しました。
そのため、タイトルを変更します。

  • 「空白」というのは何ですか? Unicode で言うと U+0020 のことですか? コマンドラインから >sample.exe 1 2 3 " " と実行した時と同じ結果になればいいのですか? -
  • 質問者さんは回答欄に書くのでなく、追加・修正などがあればそれは質問欄に書いていただくようお願いします。ここではそれが流儀のようですので、質問者さんに回答欄に書かれると訳が分からなくなりがちです。 -
  • SurferOnWwwさん
    すみません、初めて利用したので、、
    今後はコメント欄に記入します。
    -
  • 出来れば質問者さんの書いた回答欄の内容は質問欄に移動して、回答欄の中身は削除して代わりに「質問欄に移動」と書くとかしていただけませんか? -
  • > コマンドラインから sample.exe 1 2 3 "" と同様の結果にさせたいと考えています。← そのコマンドライン引数の "" は空白(Unicode で言うと U+0020)ではなくて、String.Empty ですよ。空白ならば "" ではなくて " " とするべきでは? -
  • ご指摘ありがとうございます。回答欄から質問欄へ移動、回答欄にはその旨を記載しました。 -
  • >sample.exe 1 2 3 " " で実行した結果、確かに空白(Unicode U+0020)が引数として認識されました。
    しかし、期待していた結果になったのは質問欄【2018/02/14 20:40 追記】に記載した2ケースでした。
    この場合、そもそも引数には空白ではなくString.Empty(空文字)を設定するべきだったのかもしれません、、
    -
  • 質問欄への移動の件、対応ありがとうございました。sample.exe が .NET アプリで、内部的に String.Empty となるようにできれば良いのですか? -

回答

sample.exe が .NET アプリで、内部的に String.Empty となるようにできれば良いということであれば、質問者さんが最初に質問欄に書いたコードで望む結果になるはずなのですが。

以下のような簡単なコンソールアプリを作って、それを別のコンソールアプリから質問者さんが書いたコードと全く同様にして実行させて期待通りの結果になることを確認できました。何が違うのでしょうね?

class Program
{
    static void Main(string[] args) 
    {
        Console.WriteLine("args.Length: {0}", args.Length);
        for (int i = 0; i < args.Length; i++)
        {
            Console.WriteLine("args[{0}]: {1}", i, args[i]);

            bool isStringEmpty = (args[i] == string.Empty);
            bool isSpace = (args[i] == " ");
            Console.WriteLine("isStringEmpty: {0}, isSpace: {1}", isStringEmpty, isSpace);
        }

        Console.Read();
    }
}

(1) 質問者さんの最初のコード psi.Arguments = @"1 2 3 """;

args.Length: 4
args[0]: 1
isStringEmpty: False, isSpace: False
args[1]: 2
isStringEmpty: False, isSpace: False
args[2]: 3
isStringEmpty: False, isSpace: False
args[3]:
isStringEmpty: True, isSpace: False

(2) arika_onzk さんの回答 psi.Arguments = @"1 2 3 """"";

args.Length: 4
args[0]: 1
isStringEmpty: False, isSpace: False
args[1]: 2
isStringEmpty: False, isSpace: False
args[2]: 3
isStringEmpty: False, isSpace: False
args[3]:
isStringEmpty: True, isSpace: False

(3) ちなみに空白の場合 psi.Arguments = @"1 2 3 "" """;

args.Length: 4
args[0]: 1
isStringEmpty: False, isSpace: False
args[1]: 2
isStringEmpty: False, isSpace: False
args[2]: 3
isStringEmpty: False, isSpace: False
args[3]:
isStringEmpty: False, isSpace: True

編集 履歴 (1)
  • 申し訳ありません。今回の原因はそもそも引数の設定ではありませんでした。

    sample.exeはファイル内の文字列を書き換えるアプリで、別の処理で同じファイルを閉じ忘れていたため、正しく動作しませんでした。

    引数の設定としては
    psi.psi.Arguments = @"1 2 3 """;
    で、問題ありませんでした。
    -
  • しかし、空文字や空白の確認のプログラムは大変参考になりました!
    わざわざ作成していただきありがとうございます!

    もっと早くに気付けば余計なお手間を掛けずにすんだのですが、
    申し訳ないです、、

    今回のベストアンサーはSurferOnWwwさんにさせていただきます。
    arika_onzk さんもご協力していただきありがとうございました!
    -

質問欄【2018/02/14 20:40 追記】に移動

編集 履歴 (2)

ダブルクォーテーション内のダブルクォートは通常二つ重ねるので、下記じゃないでしょうか?
psi.Arguments = @"1 2 3 """"";

編集 履歴 (0)
  • arika_onzk さん
    返信ありがとうございます。
    ダブルクォートを二つ重ねるのは、初めて知りました!
    都合によりすぐに開発環境で試すことはできないので、明日検証してみます。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。