prian0815
Goto Top

Rename vieler Verzeichnisse per Batch

Hallo Adminiustratoren-Team.
Ich bin noch vollkommener Neuling, sowohl hier im Forum wie auch im Administratoren-Bereich. Ich bekomme gerade eine dahingehende innerbetriebliche Foprtbildung. Im Moment befasse ich mich mit der Dos-Batch-Programmierung. Auf meinem eigenen Rechner wurden fast alle Unterverzeichnisse in einem Hauptverzeichniss (MyPlaylists) umbenannt. Inwischen ist bei den meisten der Zusatz (2) hinzugefügt worden.ich möchte nun per Batch diese Namensänderung rückgängig machen. konnte aber bislang nicht viel über den Befehl 'Rename' in Erfahrung bringen. Da ich sicherheitshalber alle leeren Unterverzeichnisse vor der Umbenennung löschen möchte, habe ich diesen Teil mit der Hilfe eines Freundes schon Programmiert. Das bisher erreichte sieht bislang so aus.
"echo off
cls
dir *(2)/B>list.txt
Pause
for /F "delims=|" %%n in (c:list.txt) do rd "%%n"
echo Umbenennen der Ordner mit Inhalt
??? /F delims=|%%n in (c:list.txt) do???
"
Ich hoffe mir kann hier jemand weiterhelfen, damit ich mit dem nächsten Befehl, die vorhandene 'list.txt' durchlaufen kann und dabei bei allen Verzeichnissnamen nur das (2) am Ende wegbekomme.
Für eure Hilfe meinen Dank im Vorraus.

P.S.: alöways look on the bright Side of Life!

Content-Key: 105787

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

Printed on: April 20, 2024 at 02:04 o'clock

Member: bastla
bastla Jan 12, 2009 at 16:04:33 (UTC)
Goto Top
Hallo Prian0815 und willkommen im Forum!

Soferne es nur darum geht, für alle Ordner aus "list.txt" die letzten 3 Zeichen zu entfernen, könnte der Batch so aussehen:
@echo off & setlocal
for /f "delims=" %%i in (c:list.txt) do call :ProcessFolder "%%i"  
goto :eof

:ProcessFolder
set "Ordner=%~nx1"  
echo ren %1 "%Ordner:~,-3%  
goto :eof
Das "echo" vor dem "ren" sorgt dafür, dass das Umbenennen (zum Testen) durch das Anzeigen des jeweiligen Befehles nur simuliert wird - wenn Du das "echo" entfernst, wird die Namensänderung tatsächlich durchgeführt.

Informationen zu den verwendeten Befehlen findest Du mit "set /?" bzw "for /?" (hier ziemlich am Ende) ...

Grüße
bastla
Member: Prian0815
Prian0815 Jan 15, 2009 at 07:51:28 (UTC)
Goto Top
Hallo Bastla,
eigentlich hatte ich ja am Dienstag schon geantwortet, nur hat das wohl nicht geklappt - also nun noch mal.
Erstmal herzlichen Dank für deine schnelle und nette Antwort.
Ich hab am Dienstag natürlich gleich weitergemacht (Gestern mußte ich Urlaub nehmen). Inzwischen schaut mein Batch so aus:
"
echo off
del list.txt
cls
dir *(2)/S /B>list.txt
Pause
for /F "delims=|" %%n in (c:list.txt) do rd "%%n"
del list.txt
dir *(2)/S /B>list.txt
Pause
echo Umbenennen der Ordner mit Inhalt
echo off & set local
for /f "delims=" %%i in (c:list.txt) do

call :ProcessFolder "%%i"
goto :eof

:ProcessFolder
set "Ordner=%~nx1"
echo ren %1 "Ordner:~,-3%
goto :eof

:eof
rem del list.txt
echo Verarbeitung der Verzeichnisse beendet!
"
Durch den Zusatz des Patameters '/S' beim 'dir'-Befehl, werden mir nun auch alle Unterverzeichnisse mitaufgelistet, was auch so von mir gwollt ist uind war.
Leider hört das Prog nun noch vor der Zeile "echo Umbenennen der Ordner mit Inhalt" ohne Kommentar auf. Das Löschen der Verzeichnisse incl. der Unterverzeichnisse hat in dem Moment erfolgreich stattgefunden. Ein Rename fand leider nicht statt, auch nicht als Simulation, wie von dir geschrieben. Ich hab echt keinen blassen Schimmer, weshalb noch nicht mal meine Kommentarzeile am BS erscheint.
Vielleicht fällt dir ja beim 'Betrachten des Batch auf, wo da der Fehler steckt.

Mit freundlichen Grüßen Prian0815


P.S.:always look on the bright Side of Life!
Member: bastla
bastla Jan 15, 2009 at 13:42:22 (UTC)
Goto Top
Hallo Prian0815!

Vorweg: Speziell für das Posten von Batch- und ähnlichen Schnipseln hätte die Forumssoftware eine passende zu bieten ...
Da Du die leeren Verzeichnisse schon gelöscht hast, könntest Du den Batch auf das Umbenennen reduzieren - das könnte etwa so aussehen:
echo off & set local
for /f "delims=" %%i in ('dir "*(2)" /S /B') do call :ProcessFolder "%%i"  
rem del list.txt
echo Verarbeitung der Verzeichnisse beendet!
goto :eof

:ProcessFolder
set "Ordner=%~nx1"  
echo ren %1 "Ordner:~,-3%  
goto :eof
Teste doch bitte einmal diese Version ...
Noch eine Anmerkung:
"goto :eof" ist nicht dafür gedacht, zu einer existierenden Marke zu springen, sondern heißt ganz allgemein: "Beende die Verarbeitung!" (entweder des Batches, wie in Zeile 5, oder eines Unterprogrammes - das würde etwa einem "End Sub" aus neuerem oder einem "Return" aus älterem BASIC entsprechen).

Im Unterprogramm ":ProcessFolder" wäre die entsprechende Zeile eigentlich gar nicht nötig, da nach der letzten Batchzeile ein automatisches "Beenden" erfolgt, allerdings ist damit für den Fall vorgesorgt, dass unterhalb noch weitere Programmteile angefügt würden.

Grüße
bastla
Member: Prian0815
Prian0815 Jan 15, 2009 at 14:54:00 (UTC)
Goto Top
Hallo Bastler,
erst mal danke für den Tipp wegen der Formatierung. Ich hatte mir das schon gedacht. Ist ja in anderen meiner Porogrammierforen auch so üblich, hab nur auf die Schnelle nix gefunden. jetzt aber das Format gleich mal abgespeichert, um es in Zukunft schnell zur Verfügung zu haben.
So und nu nochmal zu dem Progschnippsel. Ich hab den von dir geposteten Code jetzt mal als extra '.BAT' gespeichert, und bekomme beim Ausführen die Meldung: "echo off & set local
Umgebungsvariable local ist nicht definiert"
nachdem ich diese Zeile mit 'rem' auskommentiert habe, läuft das Prog zwar, allerdings wurden keine Verzeichnisse umbenannt.
Ich hab dann das Prog folgendermassen angepasst:

rem echo off & set local
dir *(2)/S /B>list.txt
pause
for /f "delims=" %%i in (c:list.txt) do call :ProcessFolder "%%i"  
del list.txt
echo Verarbeitung der Verzeichnisse beendet!
goto :eof

:ProcessFolder
set "Ordner=%~nx1"  
echo ren %1 "Ordner:~,-3%  
goto :eof
Mit dem Ergevbniss, dass in der 'List.txt' wieder drin stand, was drin sterhn mußte aber wiederum kein Verzeichniss umbenannt wurde.Auch die Ausgabe "Verarbeitung der Verzeichnisse beendet" erschien nicht, aber die 'List.txt' ist im Verzeichniss nicht mehr vorhanden. Dieser Befehl wurde also noch ausgeführt.

Mit freundlichem Gruß Prian0815
Member: bastla
bastla Jan 16, 2009 at 06:52:46 (UTC)
Goto Top
Hallo Prian0815!

Wie mir das Leerzeichen zwischen "set" und "local" gelungen ist (oben hatte ich noch keines), kann ich zwar nicht erklären, dass es aber nicht da hin gehört, ist klar (ich korrigiere das zur Sicherheit) ...
Nur zur Sicherheit: Vereinheitliche die Schreibweise für die "list.txt" - in der Schleife steht noch das (unnötige) "c:" davor.

Ansonsten kannst Du eigentlich nur aus dem "echo off" ein "echo on" machen und den Batch von der Kommandozeile (was beim Testen von Batches ohnehin immer zu empfehlen ist) starten. Es werden dann alle Befehle zunächst einmal (mit bereits aufgelösten Variablen) angezeigt und dann erst ausgeführt. Bei einem längeren Batch böte es sich dann noch an, diese Anzeige durch einen Aufruf der Art
Batchdatei.cmd >Batchdatei-Log.txt 2>&1
in eine Datei umzuleiten und auch die Fehlermeldungen (Ausgabekanal 2) in die selbe Datei schreiben zu lassen.

So oder so sollten sich aus dem Ablaufprotokoll Rückschlüsse ziehen lassen ..

Grüße
bastla
Member: Prian0815
Prian0815 Jan 16, 2009 at 09:41:36 (UTC)
Goto Top
Hallo Bastler,
scheint ne längere Prozedur mit mir als Anfänger hier zu werden. Also irgendwie wills nich hinhaun.
Der Blank vor dem 'local' war auf jeden Fall falsch, den da meckert er jetzt nicht mehr.
ich hab das mit 'Echo on' und Auftruf aus der Kommandozeile gemacht. Das sah dann auch alles recht gut aus, was er mir da so angezeigt hat. Dann hab ich aus dem 'on' ein 'off' gemacht und das Prog laufen lassen. Dummerweise hat es aber die Verzeichnisse (5 gesamt, davon 3 'Unterverzeichnisse, teils leer, teils mit Dateien) nicht umbenannt. die 'list.txt' war am Ende nicht vorhanden, die Kommentarzeile 'echo Verarbeitung der Verzeichnisse beendet!' wurde allerdings nicht geschrieben. Hier zur Sicherheit das aktuelle Batch wie ich es mal mit Aufruf mal mit Doppelklick hab laufen lassen

echo off & setlocal
dir *(2)/S /B>list.txt
pause
for /f "delims=" %%i in (list.txt) do call :ProcessFolder "%%i"  
del list.txt
echo Verarbeitung der Verzeichnisse beendet!
goto :eof

:ProcessFolder
set "Ordner=%~nx1"  
ren %1 "Ordner:~,-3%  
goto :eof
Gruß Prian0815
Member: bastla
bastla Jan 16, 2009 at 10:54:35 (UTC)
Goto Top
Hallo Prian0815!

Inzwischen habe ich doch noch beide Augen aufbekommen, und dann endlich auch beide Fehler (2 Fehler auf 20 Zeichen - reife Leistung face-sad) in Zeile 11 gefunden - sory, manchmal dauert's lang, dann wieder länger ...

Eigentlich sollte die Zeile so lauten:
ren %1 "%Ordner:~,-3%"
Grüße
bastla
Member: Prian0815
Prian0815 Jan 16, 2009 at 11:47:27 (UTC)
Goto Top
Hi bastler,
jepp - das wars - jetzt hat das geklappt.
und wegen dem länger - mach der da ma nix draus, 'was lange währt wird endlich gut' sacht n altes Sprichwort.
Herzlichen Dank dir!!
Nun kann ich gleich mein nächstes Prob mit dem korrekten Backup-Befehl angehn.

backup c:\Dokumente und Einstellungen\Brenner\Eigene Dateien c: /s

bei diesem sagt er mir nämlich, dass der falsch geschrieben ist und ich hab jetzt auch schon xmal draufgeschaut, Bücher gewälzt und verglichen, Parameter überprüft usw. Eigentlich soll der nur das angegebene Verzeichniss nach 'C:' sichern. Mit dem 'Xcopy' welchen ich erast mal für schwieriger zum handeln hielt, hab ich das schon mal hinbekommen.
Nu werd ich mich ma auf die Suche machen und hoffen, dass ich die korrekte Schreibweise noch rausfinde.

Gruß Prian