anve
Goto Top

Letzten zwei Unterordner aus Pfad extrahieren

Ich will die letzen zwei Unterordner eines Pfades herausfinden. Anschließend soll aus dem erhaltenen String "\" durch "_" ersetzt werden.

Hi @ll!

Ich habe folgenden Pfad:
C:\temp\test\zip\Bilder_rescaled\

Daraus soll
zip_Bilder_rescaled
werden.

Ich hab folgende Ansätze probiert:
@echo off
set comppath=C:\temp\test\zip\Bilder_rescaled\
set short=%comppath:~13,-1%
echo %short%|find "/"  
echo %errorlevel%

Weder mit find noch mit findstr komme ich zu einem Ergebnis. Abgesehen davon operieren alle Beispiele auf Dateien. Ich will aber auf Strings arbeiten. Jedoch würde ich im obigen Beispiel nur als Ergebnis wissen ob der String "/" vorkommt oder nicht (wenn es funktionieren würde ...). Ich will aber die Position des vorvorletzten Schrägstriches wissen. Ich kann aber zumindest schon folgenden Teil-String filtern:
zip/Bilder_rescaled

Einen Haken hat diese Methode noch: Ich bin nicht sehr flexibel. Da aber sich der Offset (13) in meinem Beispiel gleich bleibt, geht das in Ordnung.

Ansatz 2:
@echo off & setlocal enabledelayedexpansion
set comppath=C:\temp\test\zip\Bilder_rescaled\

for /f "tokens=4-5 delims=\" %%a in ("%comppath%") do(  
	path=!path!_%%a	
)
Dieser Code funktioniert nicht. Im Moment hab ich den Fehler noch nicht gefunden. Eventuell könnte man hier auch find einsetzen.

Ansatz 3:
Irgendwo hab ich gelesen dass auch Regular Expressions mit batch Dateien verwendet werden können. Evtl. kann man ja mit dem was machen.

Sowas wie das obige wurde sicher schon 100 mal benötigt. Die Suche hat mir jedoch nicht geholfen, da alle immer auf Dateien operieren (wie die Befehle find und findstr). Hat jemand was passendes parat?

LG
anve

PS: Das ganze soll nur mit Windows XP Prof. Boardmitteln funktionieren. Da hilft leider kein SED.

Content-Key: 103029

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

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

Member: bastla
bastla Dec 01, 2008 at 12:35:12 (UTC)
Goto Top
Hallo anve!

Wenn Du sicher bist, dass der Pfad am Ende einen "\" hat, dann so (anderenfalls eben ein "if" verwenden):
@echo off & setlocal enabledelayedexpansion
set comppath=C:\temp\test\zip\Bilder_rescaled\

for %%i in ("%comppath:~,-1%") do (  
    set "parent=%%~dpi%  
    for %%j in ("!parent:~,-1!") do set "last2=%%~nxj_%%~nxi"  
)
echo "%last2%"  
Für die Zerlegung mittels d/p/n/x gilt ganz einfach: Alles nach dem letzten "\" wird als Dateiname (+ ev Extension) betrachtet.

Grüße
bastla
Member: anve
anve Dec 01, 2008 at 13:30:16 (UTC)
Goto Top
Hallo bastla!

Wieder mal eine schnelle und funktionierende Lösung von dir! Danke!

Nur damit ich den Code besser verstehe:

Hier schneidest du nur das letzte "\" ab:
for %%i in ("%comppath:~,-1%") do (   

Hier bekommst du nur den Pfad und schneidest evtl. Dateiname & Extensions weg.
set "parent=%%~dpi%   
Warum hast du '' am Anfang und ein % am Ende? Das ist wahrscheinlich die allgemeine Notation. Mit % am Anfang und am Ende wird der Ausdruck ausgewertet (aufgelöst). Und mit den %%~ kann man den Ausdruck/Pfad nach vorgegebenen Regeln auswerten. [EDIT]Das '' am Anfang gehört hier glaub ich nicht hin.[/EDIT]

Wenn ich falsch liege, bitte korrigiere mich.

Hier bekommst du alles was zwischen zwei "/" steht:
for %%j in ("!parent:~,-1!") do set "last2=%%~nxj_%%~nxi"   
Aber warum schneidest du hier wieder das letzte "\" weg? Ich vermute, dass er hier ansonsten dass "/" mitnehmen würde. OK, jetzt hab ich es wahrscheinlich. Du betrachtest den letzten Teil zwischen zwei "/" als Dateiname und Erweiterung. Mittels ~nxi bzw. ~nxj filterst du diesen letzen Teil des Pfades raus. Damit er aber es so machen kann, muss das letzte "/" weg. Da ja keine Erweiterung vorhanden ist, betrachtet Windows diesen Pfad ganz normal und somit erhält man den Ordnernamen.
Dass das %%~nxi funktioniert, weiß ich. Wie kommt Windows aber zu %%~nxj? [EDIT]Funktioniert auch nur mit ni und nj[/EDIT]

Wenn ich drei for-Schleifen hätte, könnte ich dann die letzten 3 Unterordner bekommen? Das würde dann heißen, dass der Ausdruck im obigen Beispiel zwei mal "zerlegt" wurde. Eine Art rekursiver Algorithmus der von hinten an fängt ...

Ich wär jedenfalls nie von alleine darauf gekommen. Danke vielmals!

LG
anve
Member: bastla
bastla Dec 01, 2008 at 14:39:05 (UTC)
Goto Top
Hallo anve!

set "parent=%%~dpi%
Warum hast du " am Anfang und ein % am Ende?
Wenn ich das selber wüsste face-wink - natürlich sollten es in beiden Fällen Anführungszeichen sein ...
Das " am Anfang gehört hier glaub ich nicht hin.
Doch - das war Absicht: Mit dieser Schreibweise ergibt sich eine bessere Kontrolle darüber, was in die Variable aufgenommen wird (so können zB unbeabsichtigt angefügte Leerzeichen am Ende vermieden werden), ohne allerdings die Anführungszeichen selbst "einzubauen" - wenn ich Anführungszeichen benötige, kann ich diese dann ja gezielt setzen ...
Wenn ich drei for-Schleifen hätte, könnte ich dann die letzten 3 Unterordner bekommen?
In diesem Fall wäre vielleicht schon zu überlegen, das Ganze in einem Unterprogramm (als eine Art "Funktion") durchzuführen - unhandlich dabei ist aber die Tatsache, dass ein Wert (der Pfad) zu übergeben ist, es aber eigentlich zwei Rückgabewerte (den letzten Ordner des Pfades und den Rest davor) gäbe.

Grüße
bastla
Member: anve
anve Dec 02, 2008 at 09:48:09 (UTC)
Goto Top
Hi bastla!

Vielen Dank nochmals!

LG
anve