引数がどこから始まるのかわからないプログラムをどのように実行しますか?
-
03-07-2019 - |
質問
被験者は、1行で質問することは容易ではないので、多くの原因を述べていません。
レジストリから読み取ったいくつかのプログラムを実行する必要があります。誰かがパスと引数全体を保存するフィールドから読む必要があります。
System.Diagnostics.ProcessStartInfoを使用してプログラムの名前とその引数を設定しましたが、1つのフィールドにプロセス実行可能ファイルを保存し、他のフィールドにその引数を保存するために解析する必要のあるさまざまな引数を見つけました。
文字列全体をそのまま実行する方法はありますか?
解決
プロセス開始情報でcmd.exeを使用して、上記のポスターと同じ方法でこれに取り組みました。
Process myProcess = New Process;
myProcess.StartInfo.FileName = "cmd.exe";
myProcess.StartInfo.Arguments = "/C " + cmd;
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myProcess.StartInfo.CreateNoWindow = True;
myProcess.Start();
myProcess.WaitForExit();
myProcess.Close();
cmd / cはコマンドを実行し、終了します。 WaitForExitは、実行時間が長すぎるとプロセスを終了します。
他のヒント
実際にはいくつかあります。
- / C [コマンドライン]を引数としてcmd.exeを呼び出すことができます。これにより、cmd.exeがコマンドを処理してから終了します。
- コマンドをバッチファイルに書き込んで起動できます。
そしてもちろん、あなたが今取っているアプローチ、つまりコマンドラインの解析もあります。
「 UseShellExecute 」が設定されていない場合、System.Diagnostics.Processは CreateProcess を呼び出します。 a>または CreateProcessAsUser で実際にプログラムを開始します(2番目のユーザー/ドメイン/パスワードを指定する場合は1つ)。そして、これらの呼び出しは両方とも、単一の引数としてコマンドとファイルを取ることができます。 MSDNから:
lpApplicationNameパラメーターは ヌル。その場合、モジュール名 最初の白でなければなりません スペース–で区切られたトークン lpCommandLine文字列。 ...
lpApplication名はProcessStartInfo.Filenameにマップされ、lpCommandLineはArgumentsにマップされます。だから、あなたはただ行くだけである必要があります:
var processStartInfo = new ProcessStartInfo()
{
UseShellExecute = false,
Arguments = cmd
};
Process.Start(processStartInfo);