Moin!
Ich habe ein Script, das ein anders Script 10 mal startet, dann auf wartet, dass alle 10 Jobs beendet sind, um danach deren Ausgabe anzuzeigen. Was ich nicht verstehe, ist, warum das so lange dauert.
Hier das äußere Script (c:\ps\tst.ps1):
$Logfile="C:\ps\tst.log" ############################################################## # Schreibt "LogData" mit vorangestelltem Timestamp in die # Logdatei (gemäß $Logfile). Function LogWrite($LogData) { $LogTime=Get-Date -Format "yyyy-dd-MM HH:mm:ss" $LogMsg=$LogTime + " " + $LogData Add-content $Logfile -Value $LogMsg } $jobs=@() for($i=0; $i -lt 10; $i++) { $jobs+=Start-Job -Name ("job{0}" -f $i) -filepath C:\ps\sub.ps1 -ArgumentList @("job", $i) LogWrite ("Job{0} gestartet" -f $i) }"warten, bis alle fertig" do { Start-Sleep -Milliseconds 200 $stillRunning=$false foreach($jobstate in $jobs.State) { if($jobstate -eq "Running") { $stillRunning=$true break } } } while($stillRunning)"alle sind fertig" foreach($job in $jobs) { receive-job -job $job } Get-Job | Remove-Job
Und das innere (c:\ps\sub.ps1):
param([string]$nam, [string]$nr) $Logfile="C:\ps\sub.log" ############################################################## # Schreibt "LogData" mit vorangestelltem Timestamp in die # Logdatei (gemäß $Logfile). Function LogWrite($LogData) { $LogTime=Get-Date -Format "yyyy-dd-MM HH:mm:ss" $LogMsg=$LogTime + " " + $LogData Add-content $Logfile -Value $LogMsg } LogWrite "nam=", $nam, "nr=", $nr $r=Get-Random -Minimum 0 -Maximum 5000 Start-Sleep -Milliseconds $r LogWrite "nam=", $nam, "nr=", $nr, "rand=", $r Write-Host "nam=", $nam, "nr=", $nr, "rand=", $r exit 0
Wenn ich .\tst.ps1 laufen lasse, gibts folgende Ausgabe:
PS C:\ps> .\tst.ps1 warten, bis alle fertig alle sind fertig nam= job nr= 0 rand= 2817 nam= job nr= 1 rand= 3766 nam= job nr= 2 rand= 2512 nam= job nr= 3 rand= 4742 nam= job nr= 4 rand= 282 nam= job nr= 5 rand= 1258 nam= job nr= 6 rand= 3766 nam= job nr= 7 rand= 1536 nam= job nr= 8 rand= 4306 Stream was not readable.+ CategoryInfo : InvalidArgument: (C:\ps\sub.log:String) [Add-Content], ArgumentException+ FullyQualifiedErrorId : GetContentWriterArgumentError,Microsoft.PowerShell.Commands.AddContentCommand+ PSComputerName : localhost nam= job nr= 9 rand= 282 PS C:\ps>
Die Logdatei tst.log hat diesen (durchaus akzeptablen) Inhalt:
2016-11-02 17:35:55 Job0 gestartet 2016-11-02 17:35:55 Job1 gestartet 2016-11-02 17:35:55 Job2 gestartet 2016-11-02 17:35:55 Job3 gestartet 2016-11-02 17:35:55 Job4 gestartet 2016-11-02 17:35:56 Job5 gestartet 2016-11-02 17:35:56 Job6 gestartet 2016-11-02 17:35:56 Job7 gestartet 2016-11-02 17:35:56 Job8 gestartet 2016-11-02 17:35:56 Job9 gestartet
Aber sub.log diesen:
2016-11-02 17:36:14 nam= job nr= 0 2016-11-02 17:36:17 nam= job nr= 0 rand= 2817 2016-11-02 17:36:22 nam= job nr= 1 2016-11-02 17:36:22 nam= job nr= 6 2016-11-02 17:36:22 nam= job nr= 3 2016-11-02 17:36:22 nam= job nr= 7 2016-11-02 17:36:22 nam= job nr= 2 2016-11-02 17:36:22 nam= job nr= 8 2016-11-02 17:36:22 nam= job nr= 4 2016-11-02 17:36:22 nam= job nr= 9 2016-11-02 17:36:22 nam= job nr= 5 2016-11-02 17:36:22 nam= job nr= 4 rand= 282 2016-11-02 17:36:23 nam= job nr= 5 rand= 1258 2016-11-02 17:36:23 nam= job nr= 7 rand= 1536 2016-11-02 17:36:24 nam= job nr= 2 rand= 2512 2016-11-02 17:36:25 nam= job nr= 1 rand= 3766 2016-11-02 17:36:25 nam= job nr= 6 rand= 3766 2016-11-02 17:36:26 nam= job nr= 8 rand= 4306 2016-11-02 17:36:26 nam= job nr= 3 rand= 4742
1.) warum, verdammt nochmal, dauert es nach Start des letzten Jobs um 17:35:56 bis 17:36:14, bevor der erste Logeintrag von sub.ps1 geschrieben wird?
2.) in sub.ps1 wird maximal fünf Sekunden gewartet - warum liegen die Logeinträge aber zwischen 17:36:14 und 17:36:26?
Selbst wenn ich sämtliches Log-Schreiben auskommentiere, läuft das Script immer noch ca. 20 Sekunden. Kann also nicht [nur] daran liegen, das ein Job die Logdatei mit seinem Schreibzugriff sperrt. BTW: der "Add-content" schließt die Logdatei doch wohl hoffentlich unmittelbar nachdem reingeschrieben hat !?
Ich verstehe es nicht.... :-(
Vielen Dank im voraus für Tipps, wie man erreicht, dass .\tst.ps1 nach maximal sechs Sekunden fertig ist.