相似的问题参考 - 但我需要维护实时输入/输出。 (
如何将命令传递到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的工具以提供帮助。 我有一些
策略我可以使用:
您已经将流程存储在
方法应始终在尝试启动新的服务器之前检查与当前选择的服务器相关的现有过程。
当视图切换时,在ComandPromptRun
似乎正在执行流中的
ComandPromptRun
和CanRead