2016-10-06 14 views
2

私のコードでは、たくさんのcmdコマンドを実行する必要があります。それらのすべては隠されていなければなりません。例として、2つのコマンドのコードを示します。C#隠しcmdウィンドウが必要入力

string cmdText = @"/c regsvr32 vbscript.dll"; 
System.Diagnostics.Process temp = new System.Diagnostics.Process(); 
temp.StartInfo.Arguments = cmdText; 
temp.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
temp.StartInfo.FileName = "cmd.exe"; 
temp.EnableRaisingEvents = true; 
temp.Start(); 
temp.WaitForExit(); 
cmdText = @"/c regsvr32 jscript.dll"; 
temp.StartInfo.Arguments = cmdText; 
temp.Start(); 
temp.WaitForExit(); 

今問題は、コマンドの一部(例えばgpupdate /force)は、入力(例えば、 "Y/N")を必要とすることです。この入力をどのようにしてcmdに与えるのですか?

+0

しかし、 'gpupdate/force'にはY/Nプロンプトがありません。それはちょうど??????を実行する –

+0

@Noodles、それは私のマシン上にあります。ポリシーが更新された後cmdは私のPCを再起動するかどうか尋ねます – Hedgehog

答えて

0

右だ、答えは非常に簡単です。成功したサイレントcmdが、私は以下の追加を使用し、プロンプトでコマンドを起動するには(例はgpupdate /forceのために正常に動作します)

string cmdText = @"/c echo n | gpupdate /force"; 
System.Diagnostics.Process temp = new System.Diagnostics.Process();   
temp.StartInfo.Arguments = cmdText; 
temp.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
temp.StartInfo.CreateNoWindow = true; 
temp.StartInfo.FileName = "cmd.exe"; 
temp.EnableRaisingEvents = true; 
temp.Start(); 
temp.WaitForExit(); 

答えはhereからです。正しい方向へのStephan Bauerのおかげで

私が理解したように、echo nはプロンプトでnを書きます。それはトリックを行います。

0

プログラムの出力を読み込んで処理する/必要な入力をプロセスに書き戻す必要があります。 これを実現するために、あなたもあなたのプロセス/ ProcessStartInfoのいくつかのより多くのプロパティを設定する必要があります。

string cmdText = @"/c regsvr32 vbscript.dll"; 
System.Diagnostics.Process temp = new System.Diagnostics.Process(); 
temp.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
temp.StartInfo.CreateNoWindow = true; 
temp.StartInfo.Arguments = cmdText; 
temp.StartInfo.FileName = "cmd.exe"; 
temp.StartInfo.RedirectStandardOutput=true; 
temp.StartInfo.RedirectStandardInput=true; 
temp.StartInfo.UseShellExecute=false; 
temp.Start(); 

// Read program's output 
StringBuilder sb = new StringBuilder(); 
while (!temp.StandardOutput.EndOfStream) 
{ 
    char[] buffer = new char[1024]; 
    temp.StandardOutput.Read(buffer, 0, buffer.Length); 
    sb.Append(buffer); 

    // Check output string and write something back if needed 
    if (sb.ToString().Contains("(Yes/No")) 
    { 
     temp.StandardInput.WriteLine("Y"); 
     sb.Clear(); 
    } 
} 
temp.WaitForExit(); 
+0

素早い返答をありがとう。 これは唯一の方法ですか?それは私はすべてのcmdコマンドを確認する必要があるように見えるので、それはプロンプトとそれが必要な入力があります。 cmd出力/入力で動作するメソッドを書くと、多くの場合があるかもしれません。 – Hedgehog

+0

コマンドによっては、すべての確認にyesと答える '/ y'のようなパラメータがあります。このようなパラメータをサポートしていないコマンドの場合、これが私の頭に現れる唯一の解決策です。 –

+0

'/ c gpupdate/force'でデバッグすると止まってしまいます。 'while(!temp.StandardOutput.EndOfStream)'行では、プロンプトをストリームの終わりとして識別できないように見えます。 – Hedgehog

関連する問題