Окно формы выполнения командного файла - PullRequest
3 голосов
/ 22 января 2011

Я новичок в программировании на C #. Я хотел бы, чтобы приложение содержало 1 текстовое поле и 1 кнопку отправки для запуска командного файла.

Файл d: \ XMLupdate.bat, но программа добавляет в файл число из командной строки. например, d: \ XMLupdate.bat 10 или d: \ XMLupdate.bat 15

Другое дело, что отправка должна быть проверена на 1 -999 или на ВСЕХ

По Java:

 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");
            }
        }

    }

Мой главный вопрос о методе процесса, могу ли я выполнить его так? спасибо

Ответы [ 4 ]

4 голосов
/ 22 января 2011

Вместо прямого вызова cmd.exe вы можете установить p.UseShellExecute. Это работает с пакетными файлами, файлами HTML (запускает браузер по умолчанию) и т. Д .:

[ПРИМЕЧАНИЕ: вам нужен знак @ @"c:\temp", чтобы обратный слеш не обрабатывался как escape-символ.]

      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();
2 голосов
/ 22 января 2011

«Могу ли я выполнить это так?»

  1. Ваше решение компилируется?
  2. Если так, что произойдет, когда вы запустите его?

На веще, которую я заметил, это была строка

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

Вам нужен пробел между командным файлом и следующим аргументом.

 p.StartInfo.Arguments = "xmlupdate.bat " + int.Parse(textBox1.Text);
0 голосов
/ 22 января 2011

Возможно, вы захотите подключить стандартный вывод и ошибку для процесса, перенаправляя их, чтобы вы получали уведомление о любом произведенном выводе.Это полезно для регистрации.

Возможно, вы также захотите перехватить стандартный ввод, но только если вы знаете, какой ввод он ожидает (вы не получите событие, запущенное, когда процесс хочет ввода:предоставьте его.)

Таким образом, если ваш пакетный файл / дочерний процесс хочет ввода, а вы не можете его предоставить, дочерний процесс будет зависать вечно.

0 голосов
/ 22 января 2011

Кроме ответа Эрика, я бы предложил использовать вместо него NumericUpDown .

...