Ich rufe über einen asynchronen Task ein Powershell Script als Prozess auf und lese die Ausgabe des Prozess in eine Variable.
private async Task FetchProcesses(string serverName)
{
try
{
dataGridView1.Rows.Clear();
var psi = new ProcessStartInfo
{
FileName = "powershell.exe",
//Arguments = "-ExecutionPolicy Bypass -NoProfile -Command \"Get-WMIObject -Class Win32_Service -computername " + serverName + " | select Name,StartMode,State,Status | ConvertTo-Csv -Delimiter ';' -NoTypeInformation | Select-Object -Skip 1\"",
Arguments = "-ExecutionPolicy Bypass -NoProfile -Command \"Get-WMIObject -Class Win32_Service -ComputerName " + serverName + " | ForEach-Object { '{0};{1};{2};{3}' -f $_.Name, $_.StartMode, $_.State, $_.Status }\"",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
Process process = new Process { StartInfo = psi };
// Hier sagst du dem Prozess, dass er für empfangene Daten deine Methode aufruft
process.OutputDataReceived += Process_OutputDataReceived;
process.Start();
process.BeginOutputReadLine();
await Task.Run(() => process.WaitForExit());
}
catch (Exception ex)
{
MessageBox.Show("Fehler beim Abrufen der Prozessinformationen: " + ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Dabei wird mit
process.OutputDataReceived += Process_OutputDataReceived;
jeder empfangene Datensatz in Echtzeit in einen DataGridView geschrieben. Das Problem ist das sich das Programm aufhängt wenn man das Form schließt während die Daten noch in den DataGridView eingetragen werden. Kann man das irgendwie umgehen ohne auf das asynchrone Laden zu verzichten?