Start-Process mit -RedirectStandardOutput in der Windows Aufgabenplanung
Hallo zusammen,
folgendes Skript funktioniert, wenn es über die Shell aufgerufen wird.Über die Aufgabenplanung erhalte ich nicht den StandardOutput, welches in die Variable umgeleitet wurde.
Was soll das Skript tun:
- Es holt sich über VBoxManage von Oracle VirtualBox die Information, welche VMs aktuell laufen.
- Beendet die VMs, welche aktuell laufen
Die while-Schleife extrahiert die Namen der Maschine aus dem Output, denn der Output wird mit Name UUID ausgegeben.
Danke und Gruß, Sascha
folgendes Skript funktioniert, wenn es über die Shell aufgerufen wird.
$vBoxManage = "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"
$vmNames = @()
$processInfo = New-Object System.Diagnostics.ProcessStartInfo
$processInfo.FileName = $vBoxManage
# $processInfo.RedirectStandardError = $true
$processInfo.RedirectStandardOutput = $true
$processInfo.UseShellExecute = $false
$processInfo.Arguments = "list runningvms"
$process = New-Object System.Diagnostics.Process
$process.StartInfo = $processInfo
$process.Start() | Out-Null
$process.WaitForExit()
$processOutput = $process.StandardOutput.ReadToEnd()
# $processError = $process.StandardError.ReadToEnd()
# "Ouput: $processOutput" | Out-File -Encoding "ASCII" -Append $logFile
# "Error: $processError" | Out-File -Encoding "ASCII" -Append $logFile
# "Exit-Code: " + $process.ExitCode | Out-File -Encoding "ASCII" -Append $logFile
while (($startIndex = $processOutput.IndexOf('"')) -ge 0){
$processOutput = $processOutput.Substring($startIndex + 1)
$endIndex = $processOutput.IndexOf('"')
$vmName = $processOutput.Substring(0, $endIndex)
$vmNames += $vmName
$processOutput = $processOutput.Substring($endIndex + 1)
}
foreach ($runningVM in $vmNames){
saps $vBoxManage -Argumentlist ('controlvm "' + $runningVM + '" acpipowerbutton') -Wait -NoNewWindow
Sleep -s 60
}
Was soll das Skript tun:
- Es holt sich über VBoxManage von Oracle VirtualBox die Information, welche VMs aktuell laufen.
- Beendet die VMs, welche aktuell laufen
Die while-Schleife extrahiert die Namen der Maschine aus dem Output, denn der Output wird mit Name UUID ausgegeben.
Danke und Gruß, Sascha
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 326058
Url: https://administrator.de/contentid/326058
Ausgedruckt am: 25.11.2024 um 07:11 Uhr
7 Kommentare
Neuester Kommentar
Moin,
wird das Skript mit den richtigen Berechtigungen ausgeführt? Welche Parameter verwendest du im Taskplaner? Ist UAC an oder aus? Wie wärs wenn du mal StdErr analysieren würdest (hast du auskommentiert)?! Oder mit Start-Transcript dir alles loggen lassen würdest?
Besser man macht das so
Gruß mik
wird das Skript mit den richtigen Berechtigungen ausgeführt? Welche Parameter verwendest du im Taskplaner? Ist UAC an oder aus? Wie wärs wenn du mal StdErr analysieren würdest (hast du auskommentiert)?! Oder mit Start-Transcript dir alles loggen lassen würdest?
$process.WaitForExit()
WaitForExit() ist Buggy und funktioniert nicht immer wie vorgesehen.Besser man macht das so
$process.Start()
$lines = @()
while(!$process.HasExited){
$lines += $process.StandardOutput.ReadLine()
}
Dann lese wie geschrieben Stderr des Subprocess aus.
Der Prozess hat den PS Prozess als Parent, logisch, aber ein Fenster hat nichts damit zu. STDOUT und STDERR lässt sich auch ohne Fenster Capturen. Vermutlich liegt das einfach an einer Inkompatibilität der EXE, kanns hier aber im Moment nicht testen.
Kann damit jedoch nicht die Umleitung des Outputs direkt in die Variable leiten.
Doch kannst du
Sei froh wenn's so einfach war