saschard
Goto Top

Start-Process mit -RedirectStandardOutput in der Windows Aufgabenplanung

Hallo zusammen,

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
}
Ü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

Content-ID: 326058

Url: https://administrator.de/contentid/326058

Ausgedruckt am: 25.11.2024 um 07:11 Uhr

131381
Lösung 131381 11.01.2017 aktualisiert um 12:10:43 Uhr
Goto Top
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?
$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()
}
Gruß mik
SaschaRD
SaschaRD 11.01.2017 um 15:21:17 Uhr
Goto Top
Hallo @131381,

UAC ist aus.
Aufruf ist Programm/Skript: %systemroot%\System32\WindowsPowerShell\v1.0\powershell.exe
Argumente: -ExecutionPolicy Bypass -Command "C:\Skripts\shutdown.ps1"
ExecutionPolicy steht auf Unrestricted

Sieht so aus als würde der Prozess in einem eigenen Fenster ausgeführt werden, denn ich erhalte über die Aufgabenplanung keinerlei Rückmeldung. Start-Transcript hatte ich auch testweise drin liefert s.o. nichts zurück.

Habe $processInfo.CreateNoWindow = $true gesetzt wie es in beschrieben steht.

Danke und Gruß, Sascha
131381
131381 11.01.2017 um 15:29:47 Uhr
Goto Top
Dann lese wie geschrieben Stderr des Subprocess aus.
SaschaRD
SaschaRD 11.01.2017 aktualisiert um 15:42:16 Uhr
Goto Top
Hätte ich dazu schreiben sollen. Wird es über die Konsole ausgeführt kommt kein Error, denn es funktioniert. Wird es über die Aufgabenplanung durchgeführt wird nichts weitergeleitet, weder Transcript, noch Error, ExitCode oder der normale Output. Daher meine Vermutung, dass der Prozess in einer separaten Shell geöffnet wird, was mit dem Parameter "CreateNoWindow" unterbunden werden sollte.

Denn führe ich
saps $vBoxManage -Argumentlist "list runningvms" -Wait -NoNewWindow -RedirectStandardOutput $logFile  
aus wird der Output entsprechend umgeleitet. Kann damit jedoch nicht die Umleitung des Outputs direkt in die Variable leiten.

Gruß, Sascha
131381
131381 11.01.2017 aktualisiert um 15:48:12 Uhr
Goto Top
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
SaschaRD
SaschaRD 11.01.2017 aktualisiert um 16:52:40 Uhr
Goto Top
Ziemlich peinlich, oftmals sind es doch die kleinen Dinge :o

Der Pfad zur Datei ist "C:\Scripts\shutdown.ps1" und nicht Skripts -.-

@131381 Danke für deine Unterstützung

Gruß, Sascha

P.S.: Wer seine Oracle Virtual Box VMs runterfahren möchte, ob steht das Skript =)
131381
131381 11.01.2017 um 18:28:48 Uhr
Goto Top
Zitat von @SaschaRD:
Ziemlich peinlich, oftmals sind es doch die kleinen Dinge :o
Sei froh wenn's so einfach war face-smile