Wie kann ich eine Schleife mit Inkrementen wiederholen lasse?
Hi, ich möchte eine Schleife sich wiederholen lassen also ich meine er soll durch ein Ordner gehen und wenn er eine Datei gefunden hat, dann soll er den Ordner nochmal durchgehen. ich habe schon ein fertiges script, aber ich weiß nicht wie ich es so mache, dass er die Schleife dann wiederholt.
Derzeit springt er immer von Ordner zu Ordner anstatt den Ordner zu wiederholen.
Ich denke man muss das mit I++ und so machen und so bald er den Ordner wiederholt scannen soll muss man ein I-- abziehen. kp wie ich das mache
3 Antworten
Du brauchst hierfür eine sogenannte "nested loop", also eine verschachtelte Schleife. Wenn du eine Datei gefunden hast, dann fängst du einfach die Schleife erneut von vorne an und durchsuchst den aktuellen Ordner erneut. Hierfür musst du einfach eine Variable (z.B. "i") nutzen, die du bei jedem Durchgang erhöhst ("i++") und wenn du erneut den Ordner durchsuchen möchtest, verringere die Variable einfach um eins ("i--").
Eine nested Loop ist etwas anderes:
for (int i = 0; i<n; i++) {
for (int j = 0; j<m; j++) {
}
}
Frage, wenn er den Ordner erneuert durchsucht, dann springt er zum nächsten
in Powershell gibts mehere Varianten um um verschachtelte Schleifen zu bauen.
wenn er eine Datei gefunden hat, dann soll er den Ordner nochmal durchgehen
macht für mich zwar keinen Sinn noch mal das Gleich bei jeder gefundenen Datei zu chen???,
.... aber warum nicht.
Als Pipe:
Get-ChildItem -File| #finde alle Dateien im Ordner
#bei jeder gefundenen Datei führe den Code innerhalb der geschweiften Klammer aus
ForEach-Object {
Write-Host Outer Loop found File: $_ -Foreground green #bloß ma was Anzeigen lassen
Get-ChildItem -File| #nochmal Ordner durchsuchen (wird bei jedem "äußeren" fund ausgeführt )
#dito
ForEach-Object {
Write-Host Innerer Loop found File: $_ -Foreground blue
}
}
pause
als Klassischer ForEach-Loop
$OuterScan = Get-ChildItem -File #finde alle Dateien im Ordner und speichere in äußerer Variable
#bei jeder gefundenen Datei führe den Code innerhalb der geschweiften Klammer aus
ForEach ($File in $OuterScan) { #die Variable $File ist in diesem Fall lediglich temporär
Write-Host Outer Loop found File: $File -Foreground green #bloß ma was Anzeigen lassen
$InnerScan = Get-ChildItem -File #nochmal Ordner durchsuchen und jedesmal die Innere Variable erneut befüllen
ForEach ($File in $InnerScan) { #$File temporär
Write-Host Innerer Loop found File: $File -Foreground blue
}
}
pause
Auch wenn das Iterieren über die Arrays per Indexvariable in diesem Fall völliger Unsinn ist, es geht:
$OuterScan = Get-ChildItem -File
#Anzahl der Elemente in dem Array $OuterScan ermitteln und mit der indexvariable $i darüber Iterieren
For ($i=0; $i -lt $OuterScan.Count; ++$i) {
Write-Host Outer Loop found File: $OuterScan[$i] -Foreground green
$InnerScan = Get-ChildItem -File
For ($i2=0; $i2 -lt $InnerScan.Count; ++$i2) { #aufpassen, die indexvariable für den inneren Zähler muss eien anderen Namen haben
Write-Host Innerer Loop found File: $InnerScan[$i2] -Foreground blue
}
}
pause
Mehr zu Schleifen:
Das könnte, wenn ich dein Problem richtig verstanden habe, so funktionieren:
File[] files = dir.listFiles(); // dir ist der Ordner
for (int i = 0; i < files.lenght; i++) {
File f = files[f];
if (istGesuchteDatei(f)) {
i = -1; // weil i direkt danach von der Schleife inkr. wird
}
}