wenzel
Goto Top

Per Batch übergeordnetes Verzeichnis finden

Sodann will ich mal meine erste Frage hier loswerden face-wink

Hallo Allerseits,
ich möchte eine Pfadangabe einer Datei nach dem übergeordnetem Ordnernamen auswerten.

Warum ich das brauche:
Ich habe eine Ordnerstruktur:
C:\IrgendeinPfad\Hauptordner
C:\IrgendeinPfad\Hauptordner\Ordner1
C:\IrgendeinPfad\Hauptordner\Ordner2
C:\IrgendeinPfad\Hauptordner\Ordner3

In diesen Ordnern liegen Dateien, die immer Datei.xml heissen.
Wenn ich den Hauptordner inkl. Unterordner nach *.xml Dateien durchsuche, bekomme ich eine Dateiliste wie folgt:
C:\IrgendeinPfad\Hauptordner\Datei.xml
C:\IrgendeinPfad\Hauptordner\Ordner1\Datei.xml
C:\IrgendeinPfad\Hauptordner\Ordner2\Datei.xml
C:\IrgendeinPfad\Hauptordner\Ordner3\Datei.xml

Diese sollen in ein neues Zielverzeichnis kopiert werden, daher möchte/muss ich die Dateien umbenennen:
Pfad\Zielordner\Hauptordner.xml
Pfad\Zielordner\Ordner1.xml
Pfad\Zielordner\Ordner2.xml
Pfad\Zielordner\Ordner3.xml

Den Hauptordner übergebe ich an das Batch-Skript
Ich habe hier schon einiges "geschau_klaut" face-wink
Nur reicht mir meine bisherige Lösung nicht, da ich die xml-Datei des Hauptordners nicht erwische...

Hier mal mein Code
 
set tempDir=C:\temp\GesammelteXMLDateien
if "%~1"=="" ( goto NODIR )  
for /d %%v in ("%~1\*.*") do (   
    for /f "delims=" %%d in ('dir /b /od "%%v\*.plmxml" 2^>nul^') do (  
		copy "%%v\%%d" "%tempDir%\%%~nxv%%~xd"  
	) 
)


Schön wäre, wenn ich nicht so umständlich die Ordnernamen suchen muss, sondern einfach den String (Bsp: C:\IrgendeinPfad\Hauptordner\Ordner1\Datei.xml) auswerte und alles zwischen letztem und vorletztem Backslash bekommen (in diesem Fall den String "Ordner1").

Vielen Dank schon mal an die Cracks hier...

Content-Key: 110454

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

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

Member: bastla
bastla Mar 03, 2009, updated at Oct 18, 2012 at 16:37:48 (UTC)
Goto Top
Hallo Wenzel und willkommen im Forum!

Eigentlich ging es neulich in diesem Thread um die gleiche Problemstellung ...

Grüße
bastla
Member: Biber
Biber Mar 03, 2009 at 20:33:57 (UTC)
Goto Top
Moin Wenzel,

willkommen im Forum.
Schön wäre, wenn ich nicht so umständlich die Ordnernamen suchen muss, sondern einfach den String (Bsp: C:\IrgendeinPfad\Hauptordner\Ordner1\Datei.xml) auswerte und alles zwischen letztem und vorletztem Backslash bekommen (in diesem Fall den String "Ordner1").

Klare Anforderungen sind mir die Liebsten...
Demo zum Nachkaspern am CMD-Prompt (erste Zeile ist Eingabe, zweite Zeile Ausgabe]:
for %i in ("C:\IrgendeinPfad\Hauptordner\Ordner1\Datei.xml\..") do @for %i in ("%~i") do @echo Set "ParentDir=%~ni"  
Set "ParentDir=Ordner1"  
[Geht unabhängig davon, ob C:\....Datei.xml existiert oder nicht]

Abgewandelt auf einen Batch, der mit dem Parameter "C:\IrgendeinPfad\Hauptordner\Ordner1\Datei.xml" [in Anführungszeichen] gerufen wird:
 @echo off & setlocal
set tempDir=C:\temp\GesammelteXMLDateien
if "%~1"=="" ( goto NODIR )  
REM unoptimiert FOR %%i in ("%~1\..") do @for %%i in ("%%~i") do copy "%~1" "%tempdir%\%%~ni.XML"  
FOR %%i in ("%~1\..") do @copy "%~1" "%tempdir%\%%~ni.XML"  
[ungetestet]
[Edit] Optimierung durch bastla nachgezogen[/Edit]

Grüße
Biber
Member: bastla
bastla Mar 03, 2009 at 20:48:04 (UTC)
Goto Top
@Biber
Sehr elegant face-smile - aber wozu das zweite "for"?

Grüße
bastla
Member: Biber
Biber Mar 03, 2009 at 20:58:49 (UTC)
Goto Top
Moin bastla,

...aber wozu das zweite "for"?
Ich dachte, wenn ich es nicht ein bisschen aufbausche, dann merkt jede/r wie einfach das Bätschen ist... face-wink

Okay, ich gebs zu:
for %i in ("C:\IrgendeinPfad\Hauptordner\Ordner1\Datei.xml\..") do @echo Set "ParentDir=%~ni"  
Set "ParentDir=Ordner1"  
reicht völlig aus...

Grüße
Biber
Member: Wenzel
Wenzel Mar 03, 2009 at 22:58:39 (UTC)
Goto Top
Hallo bastla, hallo Biber,
vielen Dank für die schnellen Antworten.
Ich habe Bibers Lösung bei mir reingebastelt, bei mir wird ja nicht ein Dateinamen, sondern der hauptordner übergeben, dann sieht das so aus:

set tempDir=C:\temp\GesammelteXMLDateien 
rem Abfrage, ob Parameter übergeben wurde...
FOR /F "delims=" %%i in ('dir /b /s /a-d "%~1\*.xml"') do (   
	for %%v in ("%%i\..") do (   
		Echo copy "%%i" "%tempDir%\%%~nv.xml"  
	)
)
pause

Natürlich muss das Echo in der "scharfen" Version noch raus, aber da geht es um mehrere Dateien mit jeweils bis zu 70 MB, und die remote rumzuschaufeln macht keinen Spass... face-wink

Gibt es da irgendwelche Einwände von Euch beiden Profis, wenn nein, dann setze ich mal den Haken bei gelöst...

Cool, wie einfach die Lösung ist.
Member: Wenzel
Wenzel Mar 03, 2009 at 23:00:33 (UTC)
Goto Top
Zitat von @Biber:
Moin Wenzel,
Klare Anforderungen sind mir die Liebsten...
Grüße
Biber

Klare Antworten sind mir die Liebsten face-wink

Vielen Dank, genau danach habe ich gesucht!!!

Gruß vom Wenzel