C#命令提示连接破坏了 我正在使用.NET框架在WPF中创建服务器启动器,以避免每次手动文件调整。目前,我可以从GUI中与服务器的批处理文件进行交互,但是我遇到了I ...

问题描述 投票:0回答:1

相似的问题参考 - 但我需要维护实时输入/输出。 (

如何将命令传递到c#?

中已经运行的命令提示符)

private Process cmdProcess; private bool isServerOnline = false; public void ComandPromptRun() { MainWindow mainWindow = (MainWindow)Application.Current.MainWindow; // Check if the process for the current server already exists if (mainWindow.MinecraftJavaCmdProcesses.ContainsKey(mainWindow.CurrentServer) && mainWindow.MinecraftJavaCmdProcesses[mainWindow.CurrentServer] != null) { cmdProcess = mainWindow.MinecraftJavaCmdProcesses[mainWindow.CurrentServer]; if (cmdProcess != null && !cmdProcess.HasExited) { // Reattach output event handler cmdProcess.OutputDataReceived -= CmdProcess_OutputDataReceived; cmdProcess.OutputDataReceived += CmdProcess_OutputDataReceived; // Ensure the process is still reading output if (cmdProcess.StandardOutput.BaseStream.CanRead) { cmdProcess.BeginOutputReadLine(); // Reattach reading } else { MessageBox.Show("The output stream is unavailable. Please restart the process."); } // Load previous logs if any foreach (var log in mainWindow.MinecraftJavaLogs[mainWindow.CurrentServer]) { Dispatcher.Invoke(() => { TB_ComandPromptOutput.AppendText(log + Environment.NewLine); }); } return; // Avoid starting a new process } else { MessageBox.Show("Process has exited or is unavailable. You will need to restart the server."); mainWindow.MinecraftJavaCmdProcesses[mainWindow.CurrentServer] = null; } } // Start a new process if it doesn't exist StartNewMinecraftProcess(mainWindow); } private void StartNewMinecraftProcess(MainWindow mainWindow) { string selectedServerPath = mainWindow.MinecraftJavaServers[mainWindow.CurrentServer]; // Start a new thread to run the server process new Thread(() => { try { MessageBox.Show($"Starting server at: {selectedServerPath}"); Thread.CurrentThread.IsBackground = true; cmdProcess = new Process { StartInfo = new ProcessStartInfo { FileName = $@"{selectedServerPath}\Run.bat", WorkingDirectory = selectedServerPath, UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardInput = true, CreateNoWindow = true } }; cmdProcess.OutputDataReceived += CmdProcess_OutputDataReceived; cmdProcess.Start(); cmdProcess.BeginOutputReadLine(); // Store the new process in the dictionary mainWindow.MinecraftJavaCmdProcesses[mainWindow.CurrentServer] = cmdProcess; } catch (Exception ex) { Dispatcher.Invoke(() => MessageBox.Show($"Failed to start server: {ex.Message}")); } }).Start(); } private void CmdProcess_OutputDataReceived(object sender, DataReceivedEventArgs e) { if (!string.IsNullOrEmpty(e.Data)) { Dispatcher.Invoke(() => { // Append to TextBox TB_ComandPromptOutput.AppendText(e.Data + Environment.NewLine); // Store log in the MainWindow dictionary MainWindow mainWindow = (MainWindow)Application.Current.MainWindow; if (!mainWindow.MinecraftJavaLogs.ContainsKey(mainWindow.CurrentServer)) { mainWindow.MinecraftJavaLogs[mainWindow.CurrentServer] = new List<string>(); } mainWindow.MinecraftJavaLogs[mainWindow.CurrentServer].Add(e.Data); }); } } public void CmdProcess_IncomeDataSent(string inputData) { if (!string.IsNullOrEmpty(inputData)) { Dispatcher.Invoke(() => { if (cmdProcess != null && !cmdProcess.HasExited) { if (cmdProcess.StandardInput != null && !cmdProcess.StandardInput.BaseStream.CanWrite) { MessageBox.Show("The input stream is closed or unavailable."); return; } cmdProcess.StandardInput.WriteLine(inputData); cmdProcess.StandardInput.Flush(); } else { MessageBox.Show("Command prompt process is not running or has exited."); } }); } } private void TB_ComandPromptInput_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { CmdProcess_IncomeDataSent(TB_ComandPromptInput.Text); if (TB_ComandPromptInput.Text.ToLower() == "stop") { lb_IsServerOnline.Content = "Offline"; lb_IsServerOnline.Foreground = new SolidColorBrush(Colors.Red); TB_ComandPromptInput.IsEnabled = false; isServerOnline = false; } TB_ComandPromptInput.Text = string.Empty; } }

我尝试了什么: 用相似的代码切换到PowerShell。 在不同线程上运行该过程。 直接使用代码中的参数运行该过程,而无需批处理文件。 将命令处理器存储在主窗口中。 通过dispatcher.invoke运行所有内容。 CHATGPT和其他基于AI的工具以提供帮助。 我有一些

策略
我可以使用:

您已经将流程存储在
c# wpf batch-file cmd
1个回答
0
投票
中。确保该字典是服务器过程的真实性的单一来源。

方法应始终在尝试启动新的服务器之前检查与当前选择的服务器相关的现有过程。 当视图切换时,在ComandPromptRun

方法中始终将事件处理程序重新连接的事件处理程序的对焦。这也应正确处理该过程已退出的情况。
  1. 似乎正在执行流中的

    ComandPromptRun

    CanRead
  2. 检查,请确保它们始终如一地应用。
  3. 	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.