0
很多天我爲此問題進行了Google搜索,但沒有找到任何答案。 我有這樣的批處理文件。重定向命令行輸出,包括用戶輸入的文本提示C#
@ECHO OFF
ECHO This is sample output.
SET /P uname=Please enter your name:
IF "%uname%"=="" GOTO Error
ECHO Hello %uname%, Welcome to DOS inputs!
GOTO End
:Error
ECHO You did not enter your name! Bye bye!!
:End
pause
如何從該命令中看到它會打印出「This is sample output。」。然後會詢問用戶名稱。在C#上「這是示例輸出。」行將被作爲輸出數據接收,但文本「請輸入您的名字:」我們只有在控制檯輸入一些東西后纔會收到。 那麼,我們如何才能在輸入內容之前接收提示輸出,我們可以重定向完整控制檯嗎? (如果我們可以這樣說)。 以下是測試應用程序。
using System;
using System.Diagnostics;
namespace CommandExecuter
{
static class Program
{
static void Main()
{
try
{
var start = new ProcessStartInfo
{
FileName = @"C:\run.cmd",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true
};
using (var process = new Process())
{
process.StartInfo = start;
process.OutputDataReceived += process_OutputDataReceived;
process.ErrorDataReceived += process_ErrorDataReceived;
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
process.CancelOutputRead();
process.CancelErrorRead();
}
}
catch (Exception ex)
{
Console.WriteLine("Failed to execute command: " + ex.Message);
}
finally
{
Console.ReadLine();
}
}
private static void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data))
{
Console.Write("OutputDataReceived: " + e.Data + Environment.NewLine);
}
}
private static void process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data))
{
Console.Write("ErrorDataReceived: " + e.Data + Environment.NewLine);
}
}
}
}
如果我們如果要同時改變,那麼它永遠不會結束,因爲我們總是會在,而真正的,如果e.Data不爲空或空。 – Art
不正確。如果字符串爲空,則會退出循環。問題是你在輸入緩衝區中有兩個字符串,而你只有'if'的第一個字符串。您必須從緩衝區中清除兩個字符串,否則顯示您收到顯示的錯誤消息(上一條消息)。 – jdweng
對於我的例子e.Data不是null,所以雖然會永遠循環。 另外,e.Data不會包含「請輸入您的姓名:」數據,直到將任何內容打磨爲過程流輸入。 – Art