peterfuch85
Goto Top

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 face-smile

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

Content-ID: 602630

Url: https://administrator.de/contentid/602630

Ausgedruckt am: 23.11.2024 um 11:11 Uhr

miniversum
miniversum 07.09.2020 um 10:26:39 Uhr
Goto Top
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ß
...
Doskias
Doskias 07.09.2020 um 10:42:19 Uhr
Goto Top
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.

Zitat von @PeterFuch85:
Ist sicherlich keine elegante Lösung aber für mich würde es reichen wenn es denn funktionieren würde face-smile

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
PeterFuch85
PeterFuch85 07.09.2020 um 11:21:57 Uhr
Goto Top
Vielen Dank für Eure Lösungen. Wie gesagt, ich bin noch recht am Anfang und möchte mich nach und nach mit Programmieren beschäftigen. Ich benötige das batchfile relativ schnell für meine Arbeit und da ich jetzt kurz vor dem Ziel bin, werde ich dieses Skript noch gerne so zu ende schreiben. Danach habe ich dann Zeit und werde mir mittels Tutorials Schritt für Schritt Powershell und co. nahebringen.

Der Tipp mit ENABLEDDELAYEDEXPANSION war genau das was ich gebraucht habe.

Leider hänge ich noch an einem vermutlich trivialem Problem. Ich habe es jetzt einmal so umgeschrieben und Prüfe meine Ergebnisse mittels mkdir Befehl ob er mir das richtige Directory ausgibt. Später werde ich den mkdir befehl in robocopy umschreiben

Folgendes Skript gibt mir zwei Folder nur mit den ersten drei Ziffern, so wie ich es wollte:

@echo off
setlocal EnableDelayedExpansion

for /f %%i in ('dir /b C:\TEST\reliability\first_level\*_2') do set str=%%i & set str=!!str:~0,3!! & mkdir C:\TEST\!str!\


AUSGABE: 2 Folder mit 144 und 166

Mein Problem ist aber sobald ich den Pfad so angebe: mkdir C:\TEST\!str!_2\ (anstatt C:\TEST\!str!\)
funktioniert das leider nicht.

Hoffe Ihr könnt mir da schnell weiterhelfen!!
145916
145916 07.09.2020 aktualisiert um 12:07:56 Uhr
Goto Top
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  
145920
145920 07.09.2020 um 11:53:19 Uhr
Goto Top
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
145916
145916 07.09.2020 aktualisiert um 12:14:14 Uhr
Goto Top
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 face-wink, dann lernt man auch wichtige Dinge die man in Videos meist vermisst.
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.