c# - 提示用户输入通过 Process.start() 启动的应用程序
问题描述
我目前正在创建一个控制台应用程序来与 git 交互。这可以很好地将我的命令的输出重定向到控制台应用程序,但现在一些命令会提示输入,例如PassPhrase
or y/n for owerwrite
。如何重定向这些提示并要求用户输入。
var process = new Process();
process.StartInfo.CreateNoWindow = false;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.WorkingDirectory = workDir;
process.StartInfo.FileName = appName;
process.StartInfo.Arguments = argument;
process.Start();
var output = new List<string>();
while (process.StandardOutput.Peek() > -1)
{
output.Add(process.StandardOutput.ReadLine());
}
while (process.StandardError.Peek() > -1)
{
output.Add(process.StandardError.ReadLine());
}
process.WaitForExit();
foreach (var opt in output)
{
Console.WriteLine(opt);
}
解决方案
您需要异步读取输出和错误;这既可以让您同时读取用户的输入,又可以避免标准错误的缓冲区已满时挂起(您只是在标准输出结束后才读取它,这还不够)。
流程不要求输入;他们只是读取输入流(当然,当使用标准输入时)。解决这个问题的最简单方法是继续阅读您身边的标准输入,并将接收到的数据发布到“托管”进程的标准输入。
推荐阅读
- devexpress - DevExtreme DataGrid 颜色框
- c++ - 加解密生成器项目
- node.js - 为什么使用archiver.file模块压缩文件时出现“队列关闭错误”
- c++ - 在编译期间是否有任何用于替换函数的钩子接口?
- istio - Istio 流量路由通过匹配前缀拒绝
- amazon-web-services - AWS:配置 Cognito 用户以代入特定 IAM 角色以执行 Lambda 函数
- android-studio - Google Play 不接受由另一台 PC 签名的 android app bundle
- android - Android 8 通知未显示,ActivityThread 抛出 RemoteServiceException
- android - 关闭应用后firebase中的孩子被删除,如何让数据保留?
- java - 重新加载 Spring Kafka 在运行时使用的 SSL 上下文