Anfängerfrage: For Schleife
Hallo Zusammen,
bin absoluter Neuling in Sachen Programmierung, habe mich jetzt aber schon etwas eingelesen. Folgende Aufgabe habe ich mir vorgenommen:
Im folgendem Verzeichnis habe ich mehrere Ordner:
C:\TEST\reliability\first_level\
144_1
144_2
155_1
155_2
188_1
Jetzt möchte ich den Inhalt der Ordner die mit einer 2 Enden in den dazugehörigen Ordner mit einer _1 kopieren (oder verschieben)
Mein Ansatz in cmd lautet:
for /f %i in ('dir /b C:\TEST\reliability\first_level\*_2') do set str=%i str=%str:~0,3% && robocopy C:\TEST\reliability\first_level/%str:~0,3%_2\ C:\TEST\reliability\first_level\%str:~0,3%_1\ /E
Ist sicherlich keine elegante Lösung aber für mich würde es reichen wenn es denn funktionieren würde
Irgendwie bekomme ich nicht hin, dass er innerhalb der for Schleife die Variable für jeden Durchgang speichert. Wenn ich folgendes probiere
for /f %i in ('dir /b C:\TEST\reliability\first_level\*_2') do @echo set str=%i str=%str:~0,3%
bekomme ich immer nur die letzte Variable als str gespeichert:
set str=144_2 str=155 (hier sollte 144 stehen, wo liegt der Fehler???)
set str=155_2 str=155
Hoffe Ihr habt verstanden was mein Problem ist. Habe es etwas umständlich erklärt.
Vielen Dank für Eure Hilfe, bin mittlerweile am verzweifeln.
Viele Grüße
bin absoluter Neuling in Sachen Programmierung, habe mich jetzt aber schon etwas eingelesen. Folgende Aufgabe habe ich mir vorgenommen:
Im folgendem Verzeichnis habe ich mehrere Ordner:
C:\TEST\reliability\first_level\
144_1
144_2
155_1
155_2
188_1
Jetzt möchte ich den Inhalt der Ordner die mit einer 2 Enden in den dazugehörigen Ordner mit einer _1 kopieren (oder verschieben)
Mein Ansatz in cmd lautet:
for /f %i in ('dir /b C:\TEST\reliability\first_level\*_2') do set str=%i str=%str:~0,3% && robocopy C:\TEST\reliability\first_level/%str:~0,3%_2\ C:\TEST\reliability\first_level\%str:~0,3%_1\ /E
Ist sicherlich keine elegante Lösung aber für mich würde es reichen wenn es denn funktionieren würde
Irgendwie bekomme ich nicht hin, dass er innerhalb der for Schleife die Variable für jeden Durchgang speichert. Wenn ich folgendes probiere
for /f %i in ('dir /b C:\TEST\reliability\first_level\*_2') do @echo set str=%i str=%str:~0,3%
bekomme ich immer nur die letzte Variable als str gespeichert:
set str=144_2 str=155 (hier sollte 144 stehen, wo liegt der Fehler???)
set str=155_2 str=155
Hoffe Ihr habt verstanden was mein Problem ist. Habe es etwas umständlich erklärt.
Vielen Dank für Eure Hilfe, bin mittlerweile am verzweifeln.
Viele Grüße
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 602630
Url: https://administrator.de/contentid/602630
Ausgedruckt am: 23.11.2024 um 11:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo,
das ist eine Spezialität des von Batch.
Die Variabeln werden erst nach der Befehlszeile (nach einem Block) aufgelöst und interpretiert.
D.h. str wird zwar der Wert bei jedem Schleifendurchlauf zugewiesen aber str wird erst am Ende aufgelöst.
Umgehen kannst du das nur mit aktivierung der ENABLEDDELAYEDEXPANSION und der verwendung von ! statt % (bitte schau nach wie ENABLEDDELAYEDEXPANSION genau zu benutzen ist) oder du rufst über ein "call" eine unterprozedur auf der du den jeweiligen ordnernamen übergibst.
In dieser Unterprozedur kannst du dann über mehrere Zeilen verteilt die Variable umbauen und den copy befehl aufrufen.
Gruß
...
das ist eine Spezialität des von Batch.
Die Variabeln werden erst nach der Befehlszeile (nach einem Block) aufgelöst und interpretiert.
D.h. str wird zwar der Wert bei jedem Schleifendurchlauf zugewiesen aber str wird erst am Ende aufgelöst.
Umgehen kannst du das nur mit aktivierung der ENABLEDDELAYEDEXPANSION und der verwendung von ! statt % (bitte schau nach wie ENABLEDDELAYEDEXPANSION genau zu benutzen ist) oder du rufst über ein "call" eine unterprozedur auf der du den jeweiligen ordnernamen übergibst.
In dieser Unterprozedur kannst du dann über mehrere Zeilen verteilt die Variable umbauen und den copy befehl aufrufen.
Gruß
...
Hallo PeterFuchs,
gestatte die Frage: Wenn du dich jetzt mit Programmierung beschäftigst, wieso dann nicht mit Powershell? Die Möglichkeiten sind vielfältiger und Batch-Befehle sind verwendbar.
Ich würde an der Stelle einfach den Ordnerinhalt auslesen und dann mit einer For-Each-Schleife jeden Eintrag prüfen und bei einer entsprechenden Übereinstimmung den Kopiervorgang starten.
Mein Tipp egal was du machst:
Mach es gleich richtig. Elegante Lösungen sind einfacher zu verstehen, was dir und uns die Fehlersuche erleichtert. Mehrere Zeilen zu nutzen kostet auch nicht mehr als alles in eine Zeile zu quetschen und du lernst mehr und wirst besser.
Gruß
Doskias
gestatte die Frage: Wenn du dich jetzt mit Programmierung beschäftigst, wieso dann nicht mit Powershell? Die Möglichkeiten sind vielfältiger und Batch-Befehle sind verwendbar.
Ich würde an der Stelle einfach den Ordnerinhalt auslesen und dann mit einer For-Each-Schleife jeden Eintrag prüfen und bei einer entsprechenden Übereinstimmung den Kopiervorgang starten.
Zitat von @PeterFuch85:
Ist sicherlich keine elegante Lösung aber für mich würde es reichen wenn es denn funktionieren würde
Ist sicherlich keine elegante Lösung aber für mich würde es reichen wenn es denn funktionieren würde
Mein Tipp egal was du machst:
Mach es gleich richtig. Elegante Lösungen sind einfacher zu verstehen, was dir und uns die Fehlersuche erleichtert. Mehrere Zeilen zu nutzen kostet auch nicht mehr als alles in eine Zeile zu quetschen und du lernst mehr und wirst besser.
Gruß
Doskias
Der Tipp mit ENABLEDDELAYEDEXPANSION war genau das was ich gebraucht habe.
DelayedExpansion braucht man hier gar nicht wenn man es direkt so schreibt ...@echo off
set "quelle=C:\TEST\reliability\first_level"
for /D %%a in ("%quelle%\*2") do for /f "tokens=1 delims=_" %%b in ("%%~nxa") do robocopy "%%a" "%quelle%\%%b_1" /e
p.s. mit der Powershell sieht's z.B. so aus
ls 'C:\TEST\reliability\first_level\*2' -Directory | copy-item -Destination {join-path $_.Parent.FullName $_.Name.split("_")} -Recurse
Zur Powershell kann ich dir persönlich nur einen Tip geben.
Suche dir die Tutorials von Peter Kriegel aus. Die gibts auf Youtube.
Die sind detailliert und nutze was er sagt. Pause drücken, nochmal wiederholen usw.
Viel Spaß damit. Ich nutze sie auch, aber manchmal frage ich lieber hier,
da ich hoffe hier immer angepasste Antworten zu bekommen, was auch meistens
der Fall ist. Nicht fragen ist ein Fehler.
Gruß Apusbernd
Suche dir die Tutorials von Peter Kriegel aus. Die gibts auf Youtube.
Die sind detailliert und nutze was er sagt. Pause drücken, nochmal wiederholen usw.
Viel Spaß damit. Ich nutze sie auch, aber manchmal frage ich lieber hier,
da ich hoffe hier immer angepasste Antworten zu bekommen, was auch meistens
der Fall ist. Nicht fragen ist ein Fehler.
Gruß Apusbernd
Zitat von @145920:
Zur Powershell kann ich dir persönlich nur einen Tip geben.
Suche dir die Tutorials von Peter Kriegel aus. Die gibts auf Youtube.
Die sind detailliert und nutze was er sagt. Pause drücken, nochmal wiederholen usw.
Oder man ist altmodisch und liest sich das Handbuch durch , dann lernt man auch wichtige Dinge die man in Videos meist vermisst.Zur Powershell kann ich dir persönlich nur einen Tip geben.
Suche dir die Tutorials von Peter Kriegel aus. Die gibts auf Youtube.
Die sind detailliert und nutze was er sagt. Pause drücken, nochmal wiederholen usw.
Ich habe hier zig Azubis die meinen nur mit Videos lernen zu müssen und die verpassen fast alle wichtige Details wie z.B. das "scoping", die Ihnen hinterher fehlen. In der MS Doku stehen viele wichtige Infos die die Videos zum Großteil verschweigen, aber schon bald, wenn man effektiver und fehlerfrei arbeiten will sehr wichtig werden.