在Windows中写入正在运行的进程的stdin

时间:2015-07-01 21:00:55

标签: c# python process cmd stdin

我想从windows中的外部进程向现有进程的STDIN写入数据,并发现类似linux的问题:

  

How to write data to existing process's STDIN from external process?

     

How do you stream data into the STDIN of a program from different local/remote processes in Python?

     

https://serverfault.com/questions/443297/write-to-stdin-of-a-running-process-using-pipe

等,但现在我想知道如何在Windows中执行此操作? 我尝试使用此代码,但是我收到了错误! 我也尝试运行程序并将stdin发送到具有此鳕鱼的那个但是再次出错!

在CMD中:

type my_input_string | app.exe -start
my_input_string | app.exe -start
app.exe -start < pas.txt

在python中:

    p = subprocess.Popen('"C:\app.exe" -start',
 stdin=subprocess.PIPE, universal_newlines=True, shell=True)    
    grep_stdout = p.communicate(input='my_input_string')[0]

错误是这样的:

  

ReadConsole()失败:句柄无效。

在C#中:

        try
        {
            var startInfo = new ProcessStartInfo();
            startInfo.RedirectStandardInput = true;
            startInfo.FileName = textBox1.Text;
            startInfo.Arguments = textBox2.Text;
            startInfo.UseShellExecute = false;

            var process = new Process();
            process.StartInfo = startInfo;
            process.Start();
            Thread.Sleep(1000);
            var streamWriter = process.StandardInput;
            streamWriter.WriteLine("1");
        }
        catch (Exception ex)
        { 
                textBox4.Text = ex.Message+"\r\n"+ex.Source;
        }

enter image description here 在C#中使用该代码App.exe(命令行应用程序以新进程启动)崩溃了!但在C#应用程序中我没有任何异常!
我认为那是UseShellExecute = false;
此外,当我使用C#并且不在背景中运行应用时,我可以找到sendkeys的流程并使用my_input_string发送给{这不是一个好主意,因为用户在使用GUI时会看到命令行!

如何在没有错误的情况下发送stdin只有CMD或在python或C#中创建脚本! 有什么想法???

亲切的问候。

1 个答案:

答案 0 :(得分:4)

如果您正在启动,然后从c#提供输入,您可以执行以下操作:

var startInfo = new ProcessStartInfo("path/to/executable");
startInfo.RedirectStandardInput = true;
startInfo.UseShellExecute = false;

var process = new Process();
process.StartInfo = startInfo;
process.Start();

var streamWriter = process.StandardInput;
streamWriter.WriteLine("I'm supplying input!");

如果你需要写一个已经运行的应用程序的标准输入,我怀疑使用.net类很容易,因为Process类不会给你StandardInput(它会抛出一个InvalidOperationException

修改: 添加了ProcessStartInfo()

的参数