Benutzer mit den meisten Antworten
wie aus Pipe|"foreach-Schleife" aussteigen?

Frage
-
Hallo,
ich habe hier ein Problem mit dem "break". Ich habe ein übergeordnetes PS-Script, das mehrere andere Scripte nacheinander startet. In einem dieser Scripte wird der Inhalt einer Textdatei ausgelesen und zeilenweise mit "foreach-object" analysiert. Abhängig vom Wert der Zeile wird dann dieses foreach-Schleife mit einem "break" abgebrochen, damit die Ausführung nicht zu lange dauert.
Problem ist nun das das "break" nicht einfach die "foreach-Schleife" beendet, sondern die komplette Scriptausführung. Also sowohl das Script das das "break" enthält als auch das übergeordnete Script so das auch die nachfolgende Scripte nicht ausgeführt werden.
Damit habe ich nun zwei Probleme.
1) Funktionieren so meine Scripte natürlich nicht und ich brauche ein anderes Vorgehen. Kann mir da jemand ein Tip gehen wie ich aus der "foreach-object"-Schleife raus springen kann?
2) Kann ich auch keine ":Bezeichnung" vor dem "foreach-object" angeben un dann mittels "break :Bezeichnung" abzubrechen, da es innerhalb einer Pipe ist.
Kann mir bitte mal jemand sagen wie ich das hinbekomme? Hier die entsprechende Programmstelle:
Get-Content $lastNTBackupLog | ForEach-Object {
if ($_.StartsWith('Mediumname:') )
{
$Medienname = $_.substring(13,(($_.indexof('bkf')) - 10 ))
$Medienname = $ZielOrdner + "\" + $Medienname + ".log"
Copy-Item $lastNTBackupLog $Medienname
break foreach
}
}Vielen Dank. Ich hänge an diesem depperten Problem jetzt schon viel zu viele Stunden und komme nicht weiter. (Schlauch unter den Fußsohlen?)
Antworten
-
Hallo,
das Problem liegt daran, dass das ForEach-Object Cmdlet nicht mit einem Loop arbeitet sondern einfach jeden Befehl vom Pipe übernimmt und ausführt. Wenn anschließend break kommt, wird nicht der (nichtexistierende) Loop beendet sondern der ganze Skript/Funktion (je nach wie es eingerichtet würde).
Eine Umgangslösung wäre die Resultate in einem Array zu speichern, diese in einem for Loop unterzubringen und hier den Break Befehl auszuführen, wie etwa:
$array = (Get-Content $lastNTBackupLog) for ( $i=0; $i -le ($array.length - 1); $i++) { if ( $array[$i].StartsWith('Mediumname:')) { $Medienname = $_.substring(13,(($_.indexof('bkf')) - 10 )) $Medienname = $ZielOrdner + "\" + $Medienname + ".log" Copy-Item $lastNTBackupLog $Medienname break } }
Hoffe das hilft dir weiter.
Gruß,
Andrei- Als Antwort markiert MaFrei Dienstag, 3. August 2010 08:09
- Bearbeitet Andrei TalmaciuModerator Freitag, 13. August 2010 10:15
Alle Antworten
-
Hallo,
das Problem liegt daran, dass das ForEach-Object Cmdlet nicht mit einem Loop arbeitet sondern einfach jeden Befehl vom Pipe übernimmt und ausführt. Wenn anschließend break kommt, wird nicht der (nichtexistierende) Loop beendet sondern der ganze Skript/Funktion (je nach wie es eingerichtet würde).
Eine Umgangslösung wäre die Resultate in einem Array zu speichern, diese in einem for Loop unterzubringen und hier den Break Befehl auszuführen, wie etwa:
$array = (Get-Content $lastNTBackupLog) for ( $i=0; $i -le ($array.length - 1); $i++) { if ( $array[$i].StartsWith('Mediumname:')) { $Medienname = $_.substring(13,(($_.indexof('bkf')) - 10 )) $Medienname = $ZielOrdner + "\" + $Medienname + ".log" Copy-Item $lastNTBackupLog $Medienname break } }
Hoffe das hilft dir weiter.
Gruß,
Andrei- Als Antwort markiert MaFrei Dienstag, 3. August 2010 08:09
- Bearbeitet Andrei TalmaciuModerator Freitag, 13. August 2010 10:15
-
Ah, vielen Dank für deine Antwort. Jetzt habe ich wenigstens mal eine Erklärung was den da los ist.
Und jetzt habe ich auch einen Link gefunden der mein grundsätzlich Problem erklärt, nämlich das "foreach" und "foreach-object" NICHT das gleiche Kommando ist, auch wenn es per alias austauschbar !erscheint.
http://www.powershell-ag.de/ps/Foren/PowerShellForum/tabid/83/forumid/17/threadid/619/scope/posts/Default.aspx
Jetzt nur noch eine Frage. Braucht das Script von dir, mit dem Array, erheblich mehr Speicherplatz als die Version mit der Pipe? Kann ich das mit der Pipe so sehen das immer nur eine Zeile ausgelesen und übergeben wird, während im Array der gesamte Inhalt der Textdatei gespeichert werden muss?