Batch: for schleife mit if exist Bedingung
Hallo zusammen,
ich hänge wieder mal fest mit meinen rudimentären cmd Kenntnissen. Folgende Aufgabe habe ich:
Im Verzeichnis: C:\temp\first_level\101_1\
befinden sich mehrere Folder mit folgenden Namen:
1_001_localizer_20201012
1_002_T1_sag_mpr_Pat2_ND_20201012
1_004_STI_gre_FieldMapp_64_3_4x3_4x3_4_20201012
1_005_STI_gre_FieldMapp_64_3_4x3_4x3_4_20201012
006_STI_gre_FieldMapp
Jetzt benötige ich eine batch Datei die mir bei allen Ordnern die 1_ (Am Anfang) sowie das Datum am Ende wegschneidet. Zusätzlich soll es bei allen Foldern die ein "64_3_..." im Namen haben dieses auch noch gelöscht werden. Die Folder sollen dann all so aussen wie der letzte (006_STI_gre_FieldMapp)
Folgenden Ansatz habe ich bereits geschrieben:
@echo off
Setlocal EnableDelayedExpansion
@for /f "delims=" %%i in ('dir /b C:\temp\first_level\101_1\1*') do
(
if exist C:\temp\first_level\101_1\*64*
(set fname=%%~ni
set fname=!fname:~2,-24!
ren "%%i" "!fname!"
)
ELSE
(
set fname=%%~ni
set fname=!fname:~2,-9!
ren "%%i" "!fname!"
))
endlocal
Leider gibt er mir damit garnichts aus.
Ehrlich gesagt weiss ich auch nicht so recht wie ich eine if Bedingung in einer For Schleife einbringen kann.
Hoffe Ihr könnt mit weiterhelfen.
ich hänge wieder mal fest mit meinen rudimentären cmd Kenntnissen. Folgende Aufgabe habe ich:
Im Verzeichnis: C:\temp\first_level\101_1\
befinden sich mehrere Folder mit folgenden Namen:
1_001_localizer_20201012
1_002_T1_sag_mpr_Pat2_ND_20201012
1_004_STI_gre_FieldMapp_64_3_4x3_4x3_4_20201012
1_005_STI_gre_FieldMapp_64_3_4x3_4x3_4_20201012
006_STI_gre_FieldMapp
Jetzt benötige ich eine batch Datei die mir bei allen Ordnern die 1_ (Am Anfang) sowie das Datum am Ende wegschneidet. Zusätzlich soll es bei allen Foldern die ein "64_3_..." im Namen haben dieses auch noch gelöscht werden. Die Folder sollen dann all so aussen wie der letzte (006_STI_gre_FieldMapp)
Folgenden Ansatz habe ich bereits geschrieben:
@echo off
Setlocal EnableDelayedExpansion
@for /f "delims=" %%i in ('dir /b C:\temp\first_level\101_1\1*') do
(
if exist C:\temp\first_level\101_1\*64*
(set fname=%%~ni
set fname=!fname:~2,-24!
ren "%%i" "!fname!"
)
ELSE
(
set fname=%%~ni
set fname=!fname:~2,-9!
ren "%%i" "!fname!"
))
endlocal
Leider gibt er mir damit garnichts aus.
Ehrlich gesagt weiss ich auch nicht so recht wie ich eine if Bedingung in einer For Schleife einbringen kann.
Hoffe Ihr könnt mit weiterhelfen.
7 Antworten
- LÖSUNG 146707 schreibt am 25.11.2020 um 12:16:24 Uhr
- LÖSUNG PeterFuch85 schreibt am 25.11.2020 um 12:41:31 Uhr
- LÖSUNG 146707 schreibt am 25.11.2020 um 12:51:05 Uhr
- LÖSUNG PeterFuch85 schreibt am 25.11.2020 um 17:02:58 Uhr
- LÖSUNG PeterFuch85 schreibt am 26.11.2020 um 08:27:59 Uhr
- LÖSUNG 146707 schreibt am 26.11.2020 um 10:12:46 Uhr
- LÖSUNG PeterFuch85 schreibt am 26.11.2020 um 17:52:53 Uhr
LÖSUNG 25.11.2020, aktualisiert um 12:52 Uhr
Nimm besser gleich die Powershell ...
Batch geht natürlich auch wenn's unbedingt sein muss
ls 'C:\temp\first_level\101_1\1*' -Directory | ren -NewName {$_.Name -replace '^(1_)(.*)(_\d+)$','$2'} -Verbose
@echo off & setlocal ENABLEDELAYEDEXPANSION
for /d %%a in ("C:\temp\first_level\101_1\1_*") do (set "newname=%%~na" & set "newname=!newname:~2,-9!" & ren "%%a" "!newname!")
LÖSUNG 25.11.2020 um 12:41 Uhr
Danke primal für die schnelle Antwort.
Ich weiss, irgendwann muss ich endlich mal auf Powershell umsteigen. Für den Moment sollte es aber trotzdem leider eine normal batch sein.
Ich habe deinen Ansatz mal getestet. Leider macht es nicht genau das, was ich möchte.
Da es unterschiedliche Verzeichnisnamen gibt, möchte ich bei manchen auch mehr hinten wegschneiden als nur 9 Stellen. Deswegen muss ich mit der if exist Bedingung arbeiten.
Wenn irgendwo im Verzeichnisnamen eine 64 steht, muss ich 24 Stellen wegschneiden, ansonsten nur 9. Bekomme dass mit der for Schleife irgendwie nicht richtig hin.
Ich weiss, irgendwann muss ich endlich mal auf Powershell umsteigen. Für den Moment sollte es aber trotzdem leider eine normal batch sein.
Ich habe deinen Ansatz mal getestet. Leider macht es nicht genau das, was ich möchte.
Da es unterschiedliche Verzeichnisnamen gibt, möchte ich bei manchen auch mehr hinten wegschneiden als nur 9 Stellen. Deswegen muss ich mit der if exist Bedingung arbeiten.
Wenn irgendwo im Verzeichnisnamen eine 64 steht, muss ich 24 Stellen wegschneiden, ansonsten nur 9. Bekomme dass mit der for Schleife irgendwie nicht richtig hin.
LÖSUNG 25.11.2020, aktualisiert um 12:59 Uhr
LÖSUNG 25.11.2020 um 17:02 Uhr
Perfekt, vielen vielen Dank. Macht genau das, was ich brauche!
Auch wenn ich nicht jede Zeile verstehe, aber kann man sich ja alles anlesen...
Werde auf jeden Fall Deine Lösung nehmen, ist auch eleganter gelöst. Mich würde trotzdem interessieren, was ich in meinem Skript falsch mache, kann man evtl. garkeine "if exist" Bedingung in eine for Schleife einbauen?
Nochmal vielen Dank für Die Hilfe.
Auch wenn ich nicht jede Zeile verstehe, aber kann man sich ja alles anlesen...
Werde auf jeden Fall Deine Lösung nehmen, ist auch eleganter gelöst. Mich würde trotzdem interessieren, was ich in meinem Skript falsch mache, kann man evtl. garkeine "if exist" Bedingung in eine for Schleife einbauen?
Nochmal vielen Dank für Die Hilfe.
LÖSUNG 26.11.2020 um 08:27 Uhr
...ich hätte noch eine kleine Frage zum Skript von primal. Soweit verstehe ich alles und möchte dieses aber mit einer for-Schleife erweitern so dass das Skript vom übergeordneten ORdner alle Unterordner durchläuft. Meine VErzeichnisstruktur sieht in etwas so aus:
C:\temp\first_level --> im Ordner first_level befinden sich Ordner mit den Namen 101_1, 101_2 usw. In diesen Ordnern befinden sich dann eben die Folder die unbenannt werden müssen (s.o.)
Jetzt wollte ich einfach das Skript von Primal nehmen und mit einer zusätzlichen For- Schleife erweitern:
@echo off & setlocal ENABLEDELAYEDEXPANSION
for /d %%i in ("C:\temp\first_level\1*") do
(for /d %%a in ("%%i\1_*") do (
set "newname=%%~na"
echo %%~na|find "64" >nul 2>&1 && (
set "newname=!newname:~2,-24!"
) || (
set "newname=!newname:~2,-9!"
)
ren "%%a" "!newname!"
))
Leider macht er mit diesen Skript wieder garnichts. Lasse ich die erste Zeile mal mit do echo im cmd laufen bekomme ich korrekt die Pfade wieder die ich für die zweite Schleife benötige (C:\temp\first_level\101_1 C:\temp\first_level\101_2)
Vielen Dank schon mal Vorab für die Hilfe
C:\temp\first_level --> im Ordner first_level befinden sich Ordner mit den Namen 101_1, 101_2 usw. In diesen Ordnern befinden sich dann eben die Folder die unbenannt werden müssen (s.o.)
Jetzt wollte ich einfach das Skript von Primal nehmen und mit einer zusätzlichen For- Schleife erweitern:
@echo off & setlocal ENABLEDELAYEDEXPANSION
for /d %%i in ("C:\temp\first_level\1*") do
(for /d %%a in ("%%i\1_*") do (
set "newname=%%~na"
echo %%~na|find "64" >nul 2>&1 && (
set "newname=!newname:~2,-24!"
) || (
set "newname=!newname:~2,-9!"
)
ren "%%a" "!newname!"
))
Leider macht er mit diesen Skript wieder garnichts. Lasse ich die erste Zeile mal mit do echo im cmd laufen bekomme ich korrekt die Pfade wieder die ich für die zweite Schleife benötige (C:\temp\first_level\101_1 C:\temp\first_level\101_2)
Vielen Dank schon mal Vorab für die Hilfe
LÖSUNG 26.11.2020, aktualisiert um 21:16 Uhr
@echo off & setlocal ENABLEDELAYEDEXPANSION
for /d %%a in ("C:\temp\first_level\1*") do (
for /d %%b in ("%%~a\1*") do (
set "newname=%%~nb"
echo %%~nb|find "64" >nul 2>&1 && (
set "newname=!newname:~2,-24!"
) || (
set "newname=!newname:~2,-9!"
)
ren "%%b" "!newname!"
)
Da das hier jetzt mal wieder anfängt auf Basics-Fragen aus zu ufern, bitte Thread dann als gelöst markieren und für neue Sachen bitte einen neuen Fred aufmachen. Danke!
Gute Lektüre für dunkle Winterabende
https://administrator.de/tutorial/tutorial-for-schleife-155681.html
LÖSUNG 26.11.2020 um 17:52 Uhr
Super, nochmal vielen Dank. Funktioniert leider noch nicht (er macht überhaupt keine Änderungen an den Ordnernamen), werde es aber mal in Ruhe Zeile für Zeile durchgehen. Vielleicht habe ich auch etwas in der Verzeichnisstruktur falsch angegeben...
Das Hauptproblem ist auf jeden fall gelöst...jetzt werde ich mich mal intensiver ins Thema einlesen.
Nochmals Danke für die Hilfe und die Tipps!!!
Das Hauptproblem ist auf jeden fall gelöst...jetzt werde ich mich mal intensiver ins Thema einlesen.
Nochmals Danke für die Hilfe und die Tipps!!!