1

基本的に残っているのは、 CMD.exe を介してコマンドを呼び出すことだけであるプログラムがあります。

現在の作業ディレクトリで CMD.exe を開く必要があります (Porcess.Start(CMD.exe) を実行できることはわかっています)。

次に、プログラムで特定の文字列を cmd.exe に入力する必要があります。現在の作業ディレクトリにとどまっている間。「UseShellExecute == false」はシェルを強制終了するため使用できません。機能するにはシェルが必要です。

どうやら私はより具体的にする必要があります。したがって、cmd.exe に書き込もうとしているテキストは"clingo.exe \"Constants.txt\" \"Solver.txt\" \"Nodes.txt\" > \"Solved.txt\"". clingo.exe は、Constants、Solver、および Nodes ファイルで使用している回答セット コンパイラで、Solved にパイプされるソリューションを取得します。これらのファイルはすべて 1 つのディレクトリにあります。

4

3 に答える 3

4

まず、あなたがなぜ自分には合わないと思うのか興味がUseShellExecute=falseあります。それを正しく使用していない可能性はありますか?

これがあなたの最良の選択肢です。これは、99% のアプリで機能します。

ProcessStartInfo psi = new ProcessStartInfo
{
    FileName = "clingo.exe",
    Arguments = "\"Constants.txt\" \"Solver.txt\" \"Nodes.txt\"",
    RedirectStandardOutput = true,
    UseShellExecute = false
};

using(Process p = Process.Start(psi))
using(Stream s = File.Create("Solved.txt"))
{
    p.StandardOutput.CopyTo(s);
    p.WaitForExit();
}

これは、標準的な方法で渡された引数を好まないが、cmd.exe で動作するまれなアプリのオプションです。

ProcessStartInfo psi = new ProcessStartInfo
{
    FileName = "cmd.exe",
    RedirectStandardInput = true,
    UseShellExecute = false // note this applies to cmd.exe specifically,
                            // NOT the processes that you start from cmd.exe
};

using(Process p = Process.Start(psi))
{
    p.StandardInput.WriteLine("clingo \"Constants.txt\" \"Solver.txt\" \"Nodes.txt\" > \"Solved.txt\"");
    p.StandardInput.WriteLine("exit");
    p.WaitForExit();
}

これを機能させるには、StandardOutput と StandardError もリダイレクトする必要があるかもしれません。忘れてしまいました。

于 2012-11-30T05:37:51.867 に答える
0

引数を渡してみることができますが、exe引数が正しいことを確認してください

ProcessStartInfo proc = new ProcessStartInfo();
proc.FileName = @"C:\clingo.exe \Constants.txt\ \Solver.txt\ \Nodes.txt\ > \Solved.txt\";
proc.Arguments = @"10.2.2.125";
Process.Start(proc);
于 2012-11-30T05:29:42.933 に答える
0

コマンドラインからプロセスを開始する必要があるのはなぜですか? これはどうですか?

var process = new Process { StartInfo = new ProcessStartInfo("cmd", "/c clingo.exe Constants.txt Solver.txt Nodes.txt") };
process.Start();
process.StartInfo.RedirectStandardOutput = true;
process.WaitForExit();
//do something with process.StandardOutput, this has the results

ここで注意すべきいくつかのトリック。まず、cmd に /c 引数を使用すると、プロンプトがすぐに終了します。次に、コンテキストによっては、 を設定したい場合がありますprocess.StartInfo.CreateNoWindow = true。最後に、標準出力をリダイレクトすると、出力がバッファーを超えるとアプリがハングする可能性があることに注意してください。少し以上のデータであることが予想される場合は、入ってくるデータを読み取るために特別な努力をする必要があります。

于 2012-11-30T05:26:19.877 に答える