Многократная пакетная команда с использованием WFA - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть программа для записи некоторых команд в командный файл.Когда я отлаживаю это, программа ничего не пишет и просто меняет строку.

Есть несколько команд, которые являются отдельными, поэтому я использую if(ex* = true) для обозначения последовательности команд.однажды я изменил стандартный ввод на console.writeline, он ничего не делает.

Когда я отлаживаю с помощью Standardinfo, пакетный файл постоянно зацикливается, что происходит, когда ничего не вводится или вводится неверно.но console.writeline просто остановитесь в тот момент, когда должна быть введена первая команда.

Я думаю, может быть проблема в том, что я не даю время писать?но когда я пишу код pro.waitforexit(), программа просто зависает.поэтому я не уверен, что не так.

Код

private void button2_Click(object sender, EventArgs f) 
{
    pro.StartInfo.FileName = Path.Combine(textBox1.Text, "reproject_v1.2.bat");
    pro.StartInfo.UseShellExecute = false;
    pro.StartInfo.CreateNoWindow = true;
    pro.StartInfo.RedirectStandardInput = true;
    pro.StartInfo.RedirectStandardOutput = true;
    pro.StartInfo.RedirectStandardError = true;
    pro.OutputDataReceived += (s, e) => myMethod(e);
    pro.EnableRaisingEvents = true;

    pro.Start();
    pro.BeginOutputReadLine();

    if (ex1 == false) 
    {
        pro.StandardInput.WriteLine(textBox1.Text + @"\\");
        ex1 = true;
    }
    if (ex1 == true) 
    {
        pro.StandardInput.WriteLine("inputdata.txt");
        ex1 = false;
        ex2 = true;
    }
    if (ex2 == true) 
    {
        pro.StandardInput.WriteLine(textBox2.Text);
        ex2 = false;
        ex3 = true;
    }
    if (ex3 == true) 
    {
        pro.StandardInput.WriteLine("y");
        ex3 = false;
        ex4 = true;
    }
    pro.StandardInput.Close();
    pro.Close();
    MessageBox.Show("Check output files are exist");
}

1 Ответ

0 голосов
/ 20 сентября 2018

Я не уверен, что внутренние устройства, но WriteLine(), кажется, не блокируется, пока партия не получит стандартный ввод.Flush() нет.Но асинхронные версии WriteLineAsync() и FlushAsync() завершаются после того, как пакет получает входные данные.Я думаю, что это то, что вам нужно для отправки нескольких стандартных входов в пакет.

static void Main(string[] args)
{
    var pro = new Process();

    pro.StartInfo.FileName = @"my.bat";
    pro.StartInfo.UseShellExecute = false;
    pro.StartInfo.RedirectStandardInput = true;
    pro.StartInfo.RedirectStandardOutput = true;
    pro.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);

    pro.Start();
    pro.BeginOutputReadLine();

    // fails
    //pro.StandardInput.WriteLine("my input 1");
    //pro.StandardInput.WriteLine("my input 2");
    //pro.StandardInput.WriteLine("my input 3");

    // fails
    //pro.StandardInput.WriteLine("my input 1");
    //pro.StandardInput.Flush();
    //pro.StandardInput.WriteLine("my input 2");
    //pro.StandardInput.Flush();
    //pro.StandardInput.WriteLine("my input 3");
    //pro.StandardInput.Flush();

    // OK
    pro.StandardInput.WriteLineAsync("my input 1").Wait();
    pro.StandardInput.WriteLineAsync("my input 2").Wait();
    pro.StandardInput.WriteLineAsync("my input 3").Wait();

    // also OK
    //pro.StandardInput.WriteLine("my input 1");
    //pro.StandardInput.FlushAsync().Wait();
    //pro.StandardInput.WriteLine("my input 2");
    //pro.StandardInput.FlushAsync().Wait();
    //pro.StandardInput.WriteLine("my input 3");
    //pro.StandardInput.FlushAsync().Wait();

    pro.StandardInput.Close();
    pro.WaitForExit();
}

my.bat

set /p input1="input1: "
echo %input1%
ping localhost > nul

set /p input2="input2: "
echo %input2%
ping localhost > nul

set /p input3="input3: "
echo %input3%
ping localhost > nul

ping для сна.

...