Powershell: Unterstützung bei Start-Job benötigt im Hinblick auf Ein- und Ausgabeparameter
Hallo Community,
ich bräuchte bitte mal wieder etwas "Nachhilfe" zum Thema Start-Job bei Powershell.
Ich habe dazu folgende Aufgabe "konstruiert": Es handelt sich um einen Prozess (Division mit Restwertvorgabe) der vier Eingabe- und zwei Rückgabewerte verwertet.
Eingabewerte: Nummernbereich 0...100, Divisor, Divisionsrest, Quotient; Ausgabe: Ergebnis und Merker für Schleifenabbruch, d.h. erstem Treffer
verbale Formulierung:
Aus dem vorgegebenen Nummernbereich soll diejenige Zahl gefunden werden, bei welcher der vorgegebene Divisionsrest erreicht wird, sobald der vorgegebene Quotient den
angegebenen ganzzahligen (Mindest)wert erreicht hat. Als Ergebnis soll die gefundene Zahl und ein Merker für den Treffer ausgegeben werden:
zunächst die Variante ohne Start-Job:
Funktioniert soweit einwandfrei:
97
98
99
100
Fertig mit ForEach-Object über den Bereich 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 zum
Bestimmen der Zahl aus diesem Bereich mit einem Divisionsrest von 7, wenn die Division mit 42 mindestens groesser/gleich 1 ist
Ergebnis: 49
FinishLoop hat den Wert True
Nun habe ich den Prozessablauf auf Start-Job umgebaut. Um die Suche im Hintergrund ablaufen zu lassen und ggf. einen Warteablauf ablaufen zu lassen.
Leider ist da mindestens ein entscheidender Fehler drin, denn die while-Schleife wird nicht verlassen: Endlosschleife.
Ich habe natürlich so gut es ging recherchiert, komme aber leider nicht weiter und benötige die Unterstützung von euch, vielen Dank schon mal.
Grüsse, Roger
ich bräuchte bitte mal wieder etwas "Nachhilfe" zum Thema Start-Job bei Powershell.
Ich habe dazu folgende Aufgabe "konstruiert": Es handelt sich um einen Prozess (Division mit Restwertvorgabe) der vier Eingabe- und zwei Rückgabewerte verwertet.
Eingabewerte: Nummernbereich 0...100, Divisor, Divisionsrest, Quotient; Ausgabe: Ergebnis und Merker für Schleifenabbruch, d.h. erstem Treffer
verbale Formulierung:
Aus dem vorgegebenen Nummernbereich soll diejenige Zahl gefunden werden, bei welcher der vorgegebene Divisionsrest erreicht wird, sobald der vorgegebene Quotient den
angegebenen ganzzahligen (Mindest)wert erreicht hat. Als Ergebnis soll die gefundene Zahl und ein Merker für den Treffer ausgegeben werden:
zunächst die Variante ohne Start-Job:
[bool]$FinishLoop = $false
[int] $divisor = 42
[int] $divisionsrest = 7
[int] $quotient = 1
[int] $result = 0
$numbers = 0..100
Clear-Host
$numbers | ForEach-Object `
{
start-sleep -m 50; `
write-host $_
if( $_ % $divisor -eq $divisionsrest -and $_ / $divisor -ge $quotient -and !$FinishLoop)
{
#Write-Host "Treffer mit Wert $_"
$result = $_
$FinishLoop = $true
return
}
}
Write-Host ""
Write-Host "Fertig mit ForEach-Object über den Bereich $numbers zum Bestimmen der Zahl aus diesem Bereich mit einem Divisionsrest von $divisionsrest, wenn die Division mit $divisor mindestens groesser/gleich $quotient ist"
Write-Host ""
Write-Host "Ergebnis: $result"
Write-Host "FinishLoop hat den Wert $FinishLoop"
Funktioniert soweit einwandfrei:
97
98
99
100
Fertig mit ForEach-Object über den Bereich 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 zum
Bestimmen der Zahl aus diesem Bereich mit einem Divisionsrest von 7, wenn die Division mit 42 mindestens groesser/gleich 1 ist
Ergebnis: 49
FinishLoop hat den Wert True
Nun habe ich den Prozessablauf auf Start-Job umgebaut. Um die Suche im Hintergrund ablaufen zu lassen und ggf. einen Warteablauf ablaufen zu lassen.
Leider ist da mindestens ein entscheidender Fehler drin, denn die while-Schleife wird nicht verlassen: Endlosschleife.
Ich habe natürlich so gut es ging recherchiert, komme aber leider nicht weiter und benötige die Unterstützung von euch, vielen Dank schon mal.
Grüsse, Roger
bool]$FinishLoop = $false
[int] $divisor = 42
[int] $divisionsrest = 7
[int] $quotient = 1
[int] $result = 0
$numbers = 0..100 #PSObject
Clear-Host
start-job -argumentlist $numbers, $divisor, $divisionsrest, $quotient, [ref]$FinishLoop, [ref]$result `
-Name "MyJob" `
-scriptblock {
param ($p_numbers, $p_divisor,$p_divisionsrest,$p_quotient,[ref]$p_FinishLoop, [ref]$p_result)
$p_numbers | ForEach-Object `
{
start-sleep -m 50; `
write-host $_
if( $_ % $p_divisor -eq $p_divisionsrest -and $_ / $p_divisor -ge $p_quotient -and !$p_FinishLoop)
{
#Write-Host "Treffer mit Wert $_"
$p_result = $_
$p_FinishLoop = $true
return
}
}
}
while ((Get-Job -Name "MyJob").State -ne "Completed")
{
Write-Host "Berechnung laeuft, mache dann was anderes"
#hier weitere Aktion starten
}
Write-Host ""
Write-Host "fertig"
(Get-Job -Name "MyJob") | receive-job
Write-Host ""
Write-Host "Fertig mit ForEach-Object über den Bereich $numbers zum Bestimmen der Zahl aus diesem Bereich mit einem Divisionsreste von $divisionsrest, wenn die Division mit $divisor mindestens groesser/gleich $quotient ist"
Write-Host ""
Write-Host "Ergebnis: $result"
Write-Host "FinishLoop hat den Wert $FinishLoop"
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 563124
Url: https://administrator.de/contentid/563124
Ausgedruckt am: 24.11.2024 um 12:11 Uhr
4 Kommentare
Neuester Kommentar
[int] $divisor = 42
[int] $divisionsrest = 7
[int] $quotient = 1
$numbers = 0..100
Clear-Host
$job = start-job -argumentlist $numbers, $divisor, $divisionsrest, $quotient -Name "MyJob" -scriptblock {
param ($p_numbers, $p_divisor,$p_divisionsrest,$p_quotient)
return ($p_numbers | ?{$_ % $p_divisor -eq $p_divisionsrest -and $_ / $p_divisor -ge $p_quotient} | select -F 1)
}
$result = $job | receive-job -wait
Write-Host ""
Write-Host "Fertig über den Bereich $numbers zum Bestimmen der Zahl aus diesem Bereich mit einem Divisionsreste von $divisionsrest, wenn die Division mit $divisor mindestens groesser/gleich $quotient ist"
Write-Host "Ergebnis: $result"
Also für eine Caprisonne bin ich dann doch schon zu alt .
Eine Spezialfrage noch: kann man in der Argumenten- und Parameterliste von Start-Job auch Referenztypen übergeben? z.B.
Nein, ein Job wird in einem anderen Thread ausgeführt.
Für separate Threads nutzt man heutzutage aber eher Runspaces anstatt Jobs (Jobs sind ja ehrlich gesagt ziemlich lahm ...) und nutzt dann eine synced Hashtable die zwischen den Threads synchronisiert wird.
Alternativ wenn Parallelisierung gewünscht ist kann man auch mit Powershell Workflows arbeiten.
Du kannst auch in dem Job ein PSObject mit allen deinen Werten als Eigenschaften zurückgeben und dann im Hauptthread aus dem Object abfragen.
Du hast mir aber die while-Schleife und das Foreach-Object herausgestrichen.
Macht aber genau das selbe ohne das überflüssige Gedöhns Eine Spezialfrage noch: kann man in der Argumenten- und Parameterliste von Start-Job auch Referenztypen übergeben? z.B.
Für separate Threads nutzt man heutzutage aber eher Runspaces anstatt Jobs (Jobs sind ja ehrlich gesagt ziemlich lahm ...) und nutzt dann eine synced Hashtable die zwischen den Threads synchronisiert wird.
Alternativ wenn Parallelisierung gewünscht ist kann man auch mit Powershell Workflows arbeiten.
Du kannst auch in dem Job ein PSObject mit allen deinen Werten als Eigenschaften zurückgeben und dann im Hauptthread aus dem Object abfragen.