【问题标题】:Multiple Batch Command using WFA使用 WFA 的多个批处理命令
【发布时间】:2018-09-18 21:26:36
【问题描述】:

我有一个程序可以将一些命令写入批处理文件。当我调试这个时,程序什么也不写,只是改变了行。

有多个单独的命令,所以我使用if(ex* = true) 来指定命令序列。有一次,我将标准输入更改为console.writeline 它什么也没做。

当我使用标准信息进行调试时,批处理文件不断循环,当没有输入或输入错误时会发生这种情况。但是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");
}

【问题讨论】:

    标签: c# batch-file command-line


    【解决方案1】:

    我不确定内部结构,但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();
    }
    

    我的.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 用于睡眠。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      相关资源
      最近更新 更多