Dieser Code zeigt, wie ein Befehlszeilenprozess ausgeführt und seine Echtzeitausgabe in einer Windows Forms-TextBox angezeigt wird. Lassen Sie es uns für Klarheit und Robustheit verfeinern.
Verbesserter Code:
Diese Version fügt Fehlerbehandlung, klarere Variablennamen und verbesserte Threading-Praktiken hinzu.
<code class="language-csharp">using System; using System.Diagnostics; using System.Text; using System.Threading; using System.Windows.Forms; public static class CommandExecutor { public delegate void OutputHandler(string line); public static int Run(string workingDirectory, string command, string arguments, OutputHandler outputHandler, bool hideWindow = true) { int exitCode = -1; // Initialize to an invalid value try { using (var process = new Process()) { process.StartInfo.FileName = "cmd.exe"; process.StartInfo.WorkingDirectory = workingDirectory; process.StartInfo.Arguments = $"/c \"{command} {arguments}\" 2>&1"; // Redirect stderr to stdout process.StartInfo.CreateNoWindow = hideWindow; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; if (outputHandler != null) { process.OutputDataReceived += (sender, e) => { if (e.Data != null) { outputHandler(e.Data); } }; process.ErrorDataReceived += (sender, e) => { if (e.Data != null) { outputHandler($"Error: {e.Data}"); //Clearly mark error messages } }; } process.Start(); if (outputHandler != null) { process.BeginOutputReadLine(); process.BeginErrorReadLine(); //Begin reading error stream process.WaitForExit(); } else { process.WaitForExit(); } exitCode = process.ExitCode; } } catch (Exception ex) { MessageBox.Show($"An error occurred: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } return exitCode; } public static string GetOutput(string workingDirectory, string command, string arguments) { StringBuilder output = new StringBuilder(); Run(workingDirectory, command, arguments, line => output.AppendLine(line)); return output.ToString(); } } public partial class Form1 : Form { private TextBox txtOutput; //Declare TextBox public Form1() { InitializeComponent(); txtOutput = new TextBox { Dock = DockStyle.Fill, Multiline = true, ScrollBars = ScrollBars.Both }; Controls.Add(txtOutput); // Add the TextBox to the form //Add a button (btnExecute) to your form in the designer. } private void btnExecute_Click(object sender, EventArgs e) { //Get command and arguments from your textboxes (e.g., textBoxCommand, textBoxArguments) string command = textBoxCommand.Text; string arguments = textBoxArguments.Text; CommandExecutor.Run(@"C:\", command, arguments, line => { if (txtOutput.InvokeRequired) { txtOutput.Invoke(new MethodInvoker(() => txtOutput.AppendText(line + Environment.NewLine))); } else { txtOutput.AppendText(line + Environment.NewLine); } }); } }</code>
Wichtige Verbesserungen:
try-catch
-Block behandelt mögliche Ausnahmen während der Prozessausführung.CommandExecutor
, workingDirectory
).InvokeRequired
-Prüfung stellt die Thread-Sicherheit sicher, wenn die TextBox aus einem Hintergrund-Thread aktualisiert wird.Environment.NewLine
für konsistente Zeilenumbrüche auf allen Plattformen.Denken Sie daran, Ihrem Formular im Visual Studio-Designer ein Textfeld (z. B. txtOutput
) und eine Schaltfläche (z. B. btnExecute
) hinzuzufügen. Sie benötigen außerdem Textfelder, um den Befehl und seine Argumente einzugeben. Ersetzen Sie textBoxCommand
und textBoxArguments
durch die tatsächlichen Namen Ihrer Textfelder. Dieser verbesserte Code bietet eine robustere und benutzerfreundlichere Lösung für die Anzeige von Echtzeit-Befehlsausgaben in einer Windows Forms-Anwendung.
Das obige ist der detaillierte Inhalt vonWie zeige ich die Befehlsausgabe in Echtzeit in einem Windows Forms-Textfeld an?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!