2011-01-21 6 views
3

私はC#プログラミングが初めてです。私は1つのテキストボックスとバッチファイルを実行するための1送信ボタンを含むアプリケーションを持っていると思います。ウィンドウフォームはバッチファイルを実行します

ファイルをd:\ XMLupdate.batが、プログラムは、例えば日間ファイル にコマンドライン上の番号を追加:\ XMLupdate.bat 10またはD:\ XMLupdate.bat 15

別事は提出は、Javaのように1 -999またはALL

のいずれかに検証しなければならないことである。

Runtime rt = Runtime.getRuntime(); 
          Process pr = rt.exec(command); 
         } 
       else{ 
       try{ 
int boxNumber = Integer.parseInt(jTextField1.getText()); 
         if((boxNumber > 0) && boxNumber < 1000) 
          { 
           String arguments = jTextField1.getText(); 
           String command = "CMD /C start d:/XMLupdate.bat " + arguments; 
           Runtime rt = Runtime.getRuntime(); 

rt.exec(command); 

          } 
         else{ 
          JOptionPane.showMessageDialog(null, "Invalid value entered."); 
          } 
}catch(Exception e) 
         { 
          JOptionPane.showMessageDialog(null, "Invalid value entered."); 
         } 
        } 

しかし、マシンはJVMをインストールすることはできません。したがって、私はexeでそれを構築する必要があります。私のプログラミング言語は、C#である:ここで

は、ソースコードである:

public partial class Form1 : Form 
    { 

     //private System.Windows.Forms.TextBox textBox1; //Input text 
     //private System.Windows.Forms.Button button1; //Sumbit button 

     public Form1() 
     { 
      InitializeComponent(); 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      //get text 
      // string str_inputText = textBox1.Text; 
      if (!(textBox1.Text.Equals(""))) 
      { 
        if (textBox1.Text.Equals("ALL")) 
         { 
          try 
          { 

           Process p = new Process(); 
           p.StartInfo.FileName = "CMD.exe"; //Execute command 
           p.StartInfo.WorkingDirectory = "c:\temp"; //Diretory 
           p.StartInfo.Arguments = "xmlupdate.bat" + int.Parse(textBox1.Text); 
           p.Start(); 

           p.WaitForExit(); 

          } 

          catch (Exception ex) 
          { 

           Console.WriteLine("Exception Occurred :{0},{1}", ex.Message, ex.StackTrace.ToString()); 
           MessageBox.Show("Invalid value entered"); 

          } 
         } 

      } 

     } 

     private void textBox1_TextChanged(object sender, CancelEventArgs e) 
     { 


     } 

     private void textBox1_TextChanged(object sender, EventArgs e) 
     { 
      //Check the input number, only allow from 0 until 1000 
      try 
      { 
       int numberEntered = int.Parse(textBox1.Text); 
       if (numberEntered < 1 || numberEntered > 10) 
       { 
        // e.Cancel = true; 

       } 
      } 
      catch (FormatException) 
      { 
       // e.Cancel = true; 
       MessageBox.Show("You need to enter a number between 1 and 999"); 
      } 
     } 

    } 

私の主な質問は、処理方法についてです、私はそのようにそれを実行することができますか?ありがとう

+3

コードに特定のエラーがありますか、または実際に自分で試してみることなく動作するかどうかを尋ねていますか? – JeffO

答えて

2

「私はそれをどうやって実行できますか?」

  1. ソリューションはコンパイルされますか?
  2. もしそうなら、実行するとどうなりますか?私はバットをオフに気づいたもので

あなたはバッチファイルと次の引数の間にスペースを必要とし、このライン

p.StartInfo.Arguments = "xmlupdate.bat" + int.Parse(textBox1.Text); 

です。

p.StartInfo.Arguments = "xmlupdate.bat " + int.Parse(textBox1.Text); 
4

代わりの直接cmd.exeを呼び出し、あなたはp.UseShellExecuteを設定することができます。これは、バッチファイル、HTMLファイル(デフォルトのブラウザを起動)などと連携して動作します。

[注:あなたがそうバックスラッシュをエスケープ文字として扱われていない@"c:\temp"に@記号が必要です。]

 Process p = new Process(); 
     p.StartInfo.FileName = @"c:\temp\xmlupdate.bat"; 
     p.StartInfo.WorkingDirectory = @"c:\temp"; 
     p.StartInfo.Arguments = textBox1.Text; 
     p.UseShellExecute=true; 
     p.Start(); 
+0

+1私はc:\ tempをエスケープしませんでした。 –

0

エリックの答えのほかに、代わりにNumericUpDownコントロールを使用することをお勧めします。

0

標準的な出力とエラーをプロセスのためにフックし、生成された出力を通知するようにリダイレクトしたいと思うでしょう。ログに記録すると便利です。

あなたはまた、同様に、標準入力をフックすることがありますが、あなたはそのを期待し何の入力を知っている場合にのみ(プロセスが入力を望んでいるときに、イベントを取得しないで解雇:あなたは先制し、それを提供しています)

バッチファイル/子プロセスが入力を望んでいて、それを提供できない場合、子プロセスは永久にハングします。