peterfuch85
Goto Top

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.

Content-Key: 625593

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

Printed on: April 19, 2024 at 23:04 o'clock

Mitglied: 146707
Solution 146707 Nov 25, 2020 updated at 11:52:51 (UTC)
Goto Top
Nimm besser gleich die Powershell ...
ls 'C:\temp\first_level\101_1\1*' -Directory | ren -NewName {$_.Name -replace '^(1_)(.*)(_\d+)$','$2'} -Verbose  

Batch geht natürlich auch wenn's unbedingt sein muss
@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!")  
Member: PeterFuch85
PeterFuch85 Nov 25, 2020 at 11:41:31 (UTC)
Goto Top
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.
Mitglied: 146707
Solution 146707 Nov 25, 2020 updated at 11:59:54 (UTC)
Goto Top
Auch kein Problem
@echo off & setlocal ENABLEDELAYEDEXPANSION
for /d %%a in ("C:\temp\first_level\101_1\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!"  
)
Member: PeterFuch85
PeterFuch85 Nov 25, 2020 at 16:02:58 (UTC)
Goto Top
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.
Member: PeterFuch85
PeterFuch85 Nov 26, 2020 at 07:27:59 (UTC)
Goto Top
...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
Mitglied: 146707
Solution 146707 Nov 26, 2020 updated at 20:16:57 (UTC)
Goto Top
@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!"  
)

Einfach mal for /? in die Konsole eintippen und davon etwas lernen, statt immer nur rum zu probieren und auf die F.... zu fallen.

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
Tutorial zur FOR-Schleife
Member: PeterFuch85
PeterFuch85 Nov 26, 2020 at 16:52:53 (UTC)
Goto Top
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!!!