71655


お世話になります。  
C#でコマンドラインパラメータを指定して、外部のプログラムを実行しようとしています。  
ただ、この際のコマンドラインパラメータの作成がわからずにいます。  
現在作成中のプログラムでは、パラメータを配列で管理しており、それをそのまま渡せないかと思ったのですが、やはり「Process.Start」では文字列しか受け入れてくれないようです。  
そこで、下記のようにスペースで連結して渡すようにしました。

[code]

    string[] args;
    args = new string[3] {"A", "B", "C D"};
    Process process = Process.Start(@"C:\test\test.exe", String.Join(" ", args));
    
[/code]

ただ、これだと、空白が入った行をクォーテーションで囲んでくれたりはしないので、問題があります。  
やはりforeachで空白が入ってるかどうかを調べて、クォーテーションで囲むという作業を地道に行う必要があるでしょうか。  
また、もしかして他にもコマンドラインパラメータで何か特殊なものがあったりするでしょうか。  
ざっくりとした質問で申し訳ありませんが、教えていただけますと幸いです。  
なお、環境はWindows10 20H2 64ビットで、.netFramework4.5で動くアプリケーションを作成しています。  
以上、よろしくお願いいたします。


CC BY-SA 4.0
2020-11-02T02:29:37.347
71652
2020-11-02T03:25:03.310
2020-11-02T02:59:29.790
4236
29034
question
c# windows
C#でプログラム起動用のコマンドラインパラメータ文字列を作成する方法


Windowsでは[最終的なプロセス起動API](https://docs.microsoft.com/en-
us/windows/win32/api/processthreadsapi/nf-processthreadsapi-
createprocessw)の引数は単一の文字列です。そのため、起動されたプログラム側で単一文字列を分解する仕様です。おおよそ空白区切りだったり、`""`で括ったりという動きをしまずが、厳密にはプログラム毎に振る舞いが異なります。  
また、プログラムを起動する側は、起動されたプログラム側がどう解釈するかを見越して引数文字列を作成する必要があります。

> やはりforeachで空白が入ってるかどうかを調べて、クォーテーションで囲むという作業を地道に行う必要があるでしょうか。

おおよそそうなるかと思います。


CC BY-SA 4.0
2020-11-02T02:59:12.970
71654
2020-11-02T02:59:12.970
4236
71652
answer


.NET Core 2.1以上だと [ProcessStartInfo.ArgumentList
プロパティ](https://docs.microsoft.com/ja-
jp/dotnet/api/system.diagnostics.processstartinfo.argumentlist?view=netcore-3.1)
が使えるようですが、.NET Framework 4.5 では[ProcessStartInfo.Arguments
プロパティ](https://docs.microsoft.com/ja-
jp/dotnet/api/system.diagnostics.processstartinfo.arguments?view=netframework-4.5)のみのようなので、地道に処理するしかないようです。

ただし、こんな記事を見つけました。処理を作って公開してくれた人が居るようです。  
[Escaping an array of command-line arguments in
C#](http://gfxmonk.net/2014/04/25/escaping-an-array-of-command-line-arguments-
in-csharp.html)  
上記のGitHub  
[timbertson/csharp-quote-argv](https://github.com/timbertson/csharp-quote-
argv)

日本でそのまま使えるかどうかは不明ですが、試してみても良いのでは？

使えるなら、MIT Licenseということなので、そのまま使うか参考にして自作するかはご自由に。

* * *

ちなみにS.O.英語版に以下記事があり、例や情報量が多そうなので参考になるかも。  
[Backslash and quote in command-line
arguments](https://stackoverflow.com/q/9287812/9014308)


CC BY-SA 4.0
2020-11-02T02:59:57.737
71655
2020-11-02T03:25:03.310
2020-11-02T03:25:03.310
26370
26370
71652
answer