Batch: Alle Dateien in einem Ordner nacheinander einlesen?
Hallo folgende Situation: Ich habe verschiedene Ordner mit Dateien. Ich möchte einen Ordner auf die bsp.bat ziehen, um diesen mit der bsp.bat zu öffnen (da kommt ja der Dialog "+ Mit bsp öffnen"). Die bsp.bat soll dann nach und nach jede Datei einlesen und verarbeiten (schätzungsweise mit einer for-Schleife). Da ich quasi ein Noob in Batch bin, brauche ich allerdings Hilfe, wie der Code aussehen muss, damit die Dateien eingelesen werden. Hoffentlich war die Frage verständlich, sonst bitte nachfragen :)
3 Antworten
for %a in (*.*) do IRGENDWAS mit %a
mit Drag und Drop müsste sowas gehen:
for %a in("%~1") do WASAUCHIMMER mit %a
neuer code:
for %%a in ("%~1") do echo %a
pause
Das gibt wenigstens keine Fehlermeldung, aber es gibt nur "a" aus.
Ich bin mir nicht ganz sicher, was es ausgeben sollte, aber es sollte doch für jedes Element im Ordner etwas ausgeben...
In Batch-Skripten müssen die For-Variablen mit doppelten "%" angegeben werden. Also:
for %%a in (*.*) do echo %%a
Der Befehl
for %%a in ("%~1") do echo %%a
wird nicht den erhofften Erfolg haben und kann auch zu Problemen führen. Besser wäre folgendes:
for %%a in (%*) do echo %%a
Dadurch werden alle Parameter verarbeitet und es ergeben sich ggf. keine Probleme durch "missverstandene" Befehle. Natürlich voraus gesetzt, dass die Parameter ordentlich übergeben wurden.
Den beschriebenen Kontext-Menü-Eintrag wirst Du nur mit Hilfe der Registry einrichten können. Aber da solltest Du schon wissen, welche Datei-Typen, bzw. -Endungen mit dieser Batch verarbeitet werden sollen. Das geht aber auch global unter "HKCS\*\shell\command".
Wie das nun im Detail intern abgearbeitet werden soll, habe ich in meinen anderen Kommentaren bereits angedeutet.
Am Besten Du rufst an der Console einfach mal die Hilfen auf:
HELP FOR
oder
FOR /?
Darin stehen alle Informationen, die Du brauchst. Natürlich geht das auch mit allen anderen Befehlen.
Ok, also erstens: BATCH IST DER LETZTE MÜLL
Und nun zur Lösung des Problems:
for /R %~1 %%G in (*.*) do (call :foo "%%G")
man muss eine andere funktion aufrufen, denn DIESE BEHINDERTE SPRACHE erlaubt keine Variablendeklaration in einer for-Schleife. Zumindest kann man diese dann nicht mehr abrufen. Warum /R? Keine Ahnung ich hab einfach so lange rumprobiert bis es klappt. Warum %%G? Keine Ahnung, vermutlich weil BATCH SCHE*SSE IST!!! So den Rest meiner Probleme lasse ich jetzt mal weg.
Diese Antwort dient nur dazu, eine Lösung anzubieten, falls jemand durch googlen hierauf stößt.
Keine Ahnung, aber gleich SCHEI55E schreien!
Variablen-Deklaration geht sehr wohl innerhalb einer FOR-Schleife und der Aufruf einer CALL-Prozedur innerhalb einer FOR-Schleife erzeugt auch keinen Austritt aus der FOR-Schleife. Dasselbe gilt auch für einen IF-Befehl.
Versuch's mal mit diesem Befehl hier:
setlocal enabledelayedexpansion
Natürlich sollte man wissen, dass dann die ID's der Variablen von "%" in "!" geändert werden müssen.
BATCH ist keinesfalls Müll – zumindest nicht unter Windows. Aber man sollte diese popel-einfache Skript-Sprache auch mal lernen. Also es gibt wirklich keine Sprache, die einfacher zu erlernen ist. Wer das nicht mal kann, sollte echt nicht so peinlich aufdrehen!
Ich hätte es etwas weniger drastisch ausgedrückt, aber im Prinzip stimme ich völlig zu...
for %a in ("%~1") do echo %a
pause
liefert im cmd ausgeführt:
"~1") do echo a" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
C:\Users\Andreas\Documents\Test>for ~1") do echo a