Batch-SubRoutine - übergeordneten Ordner-Namen in Variable
Hallo zusammen,
habe nun schon mehrere Stunden mit Recherchen und Versuchen verbracht, und leider noch nichts gefunden, daher wende ich mich an euch hier in der Runde
Ich brauche für mein Backup-Batch eine Subroutine, welche mir den aktuellen übergeordneten Ordner in eine Variable wegschreibt, damit ich diese wieder an einen neuen Pfad anhängen kann.
Hier ein Beispiel:
Ich stehe in "C:\Test-Ordner\Test-Daten\Test-Sonstwas\1234\zuSichernde-Daten"
und bräuchte nun den Namen des Unterordners "zuSichernde-Daten" in einer Variable hier z.B. %varLastPfad%
Ich habe etwas funktionierendes zusammengebastelt, was ich aber als ein bißchen unschön empfinde, da bei meiner Lösung die maximale Pfad-Tiefe auf 26 Ebenen (auf Grund der For-Schleife und den Buchstaben) limitiert ist:
Kleine Erklärung meines Gedankenansatzes:
1. Ich springe in den auszulesenden Pfad mit "pushd"
2. zerhacke diesen an den Stellen mit "\" und legen ihn in einzelne Variablen a-z mit
"for /f "tokens=1-26 delims=\" %%a in ('cd') do..."
3. Diese Variablen durchlaufe ich von hinten nach vorne, um bei der ersten Füllung einer Variable diese zu speichern und aus der For-Schleife rauszuhüpfen.
4. Rücksprung in den Ursprungsordner und fertig.
Das geht doch bestimmt noch eleganter und ohne Limitierung, oder?
Die maximale Limitierung mit der ich leben könnte wäre folgendermaßen begründet:
Ich weiß ja, dass Pfade maximal 253-255 Zeichen lang sein dürfen. Das wäre also demnach bei einer "Ordner-Namens-Länge" von minimum einem Zeichen so ca. 127 Ebenen ( 255 / 2, wenn ein Ordner-Name aus einem Zeichen plus "\" besteht), d.h. wenn ich maximal mit 128 Ebenen arbeiten könnte, wäre das Prima und Ziel erfüllt.
Oder habe ich mich mittlerweile schon total verrannt und es geht ganz anders?
Vielen Dank im Voraus für eure Hilfe Ich kann mir gut vorstellen, dass die "Götter der Einzeiler und For-Schleifen" hier was passendes für mich haben, ohne das mir noch mehr graue Haare wachsen
Liebe Grüße
Stefan
habe nun schon mehrere Stunden mit Recherchen und Versuchen verbracht, und leider noch nichts gefunden, daher wende ich mich an euch hier in der Runde
Ich brauche für mein Backup-Batch eine Subroutine, welche mir den aktuellen übergeordneten Ordner in eine Variable wegschreibt, damit ich diese wieder an einen neuen Pfad anhängen kann.
Hier ein Beispiel:
Ich stehe in "C:\Test-Ordner\Test-Daten\Test-Sonstwas\1234\zuSichernde-Daten"
und bräuchte nun den Namen des Unterordners "zuSichernde-Daten" in einer Variable hier z.B. %varLastPfad%
Ich habe etwas funktionierendes zusammengebastelt, was ich aber als ein bißchen unschön empfinde, da bei meiner Lösung die maximale Pfad-Tiefe auf 26 Ebenen (auf Grund der For-Schleife und den Buchstaben) limitiert ist:
:Sub_UeberOrdner_ermitteln
echo !date!-!time!: DEBUG: ----------------------{BEGIN: Sub_UeberOrdner_ermitteln}---------------------->>"%varLogFile%" 2>&1
pushd "!varSource!"
for /f "tokens=1-26 delims=\" %%a in ('cd') do (
if not "%%z"=="" (set varLastPfad=%%z& goto :catched_UeberOrdner)
if not "%%y"=="" (set varLastPfad=%%y& goto :catched_UeberOrdner)
if not "%%x"=="" (set varLastPfad=%%x& goto :catched_UeberOrdner)
if not "%%w"=="" (set varLastPfad=%%w& goto :catched_UeberOrdner)
if not "%%v"=="" (set varLastPfad=%%v& goto :catched_UeberOrdner)
if not "%%u"=="" (set varLastPfad=%%u& goto :catched_UeberOrdner)
if not "%%t"=="" (set varLastPfad=%%t& goto :catched_UeberOrdner)
if not "%%s"=="" (set varLastPfad=%%s& goto :catched_UeberOrdner)
if not "%%r"=="" (set varLastPfad=%%r& goto :catched_UeberOrdner)
if not "%%q"=="" (set varLastPfad=%%q& goto :catched_UeberOrdner)
if not "%%p"=="" (set varLastPfad=%%p& goto :catched_UeberOrdner)
if not "%%o"=="" (set varLastPfad=%%o& goto :catched_UeberOrdner)
if not "%%n"=="" (set varLastPfad=%%n& goto :catched_UeberOrdner)
if not "%%m"=="" (set varLastPfad=%%m& goto :catched_UeberOrdner)
if not "%%l"=="" (set varLastPfad=%%l& goto :catched_UeberOrdner)
if not "%%k"=="" (set varLastPfad=%%k& goto :catched_UeberOrdner)
if not "%%j"=="" (set varLastPfad=%%j& goto :catched_UeberOrdner)
if not "%%i"=="" (set varLastPfad=%%i& goto :catched_UeberOrdner)
if not "%%h"=="" (set varLastPfad=%%h& goto :catched_UeberOrdner)
if not "%%g"=="" (set varLastPfad=%%g& goto :catched_UeberOrdner)
if not "%%f"=="" (set varLastPfad=%%f& goto :catched_UeberOrdner)
if not "%%e"=="" (set varLastPfad=%%e& goto :catched_UeberOrdner)
if not "%%d"=="" (set varLastPfad=%%d& goto :catched_UeberOrdner)
if not "%%c"=="" (set varLastPfad=%%c& goto :catched_UeberOrdner)
if not "%%b"=="" (set varLastPfad=%%b& goto :catched_UeberOrdner)
if not "%%a"=="" (set varLastPfad=%%a& goto :catched_UeberOrdner)
)
:catched_UeberOrdner
echo !date!-!time!: DEBUG: Der uebergeordnete Ordner lautet '!varLastPfad!'>>"%varLogFile%" 2>&1
popd
echo !date!-!time!: DEBUG: -----------------------{ENDE: Sub_UeberOrdner_ermitteln}---------------------->>"%varLogFile%" 2>&1
goto :eof
Kleine Erklärung meines Gedankenansatzes:
1. Ich springe in den auszulesenden Pfad mit "pushd"
2. zerhacke diesen an den Stellen mit "\" und legen ihn in einzelne Variablen a-z mit
"for /f "tokens=1-26 delims=\" %%a in ('cd') do..."
3. Diese Variablen durchlaufe ich von hinten nach vorne, um bei der ersten Füllung einer Variable diese zu speichern und aus der For-Schleife rauszuhüpfen.
4. Rücksprung in den Ursprungsordner und fertig.
Das geht doch bestimmt noch eleganter und ohne Limitierung, oder?
Die maximale Limitierung mit der ich leben könnte wäre folgendermaßen begründet:
Ich weiß ja, dass Pfade maximal 253-255 Zeichen lang sein dürfen. Das wäre also demnach bei einer "Ordner-Namens-Länge" von minimum einem Zeichen so ca. 127 Ebenen ( 255 / 2, wenn ein Ordner-Name aus einem Zeichen plus "\" besteht), d.h. wenn ich maximal mit 128 Ebenen arbeiten könnte, wäre das Prima und Ziel erfüllt.
Oder habe ich mich mittlerweile schon total verrannt und es geht ganz anders?
Vielen Dank im Voraus für eure Hilfe Ich kann mir gut vorstellen, dass die "Götter der Einzeiler und For-Schleifen" hier was passendes für mich haben, ohne das mir noch mehr graue Haare wachsen
Liebe Grüße
Stefan
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 73435
Url: https://administrator.de/contentid/73435
Ausgedruckt am: 22.11.2024 um 21:11 Uhr
5 Kommentare
Neuester Kommentar
Moin Stefan,
ich denke, es ließe sich ein bisschen zusammendampfen.
Wie wäre es mit folgender Strategie (Beispiel am CMD-Prompt):
Grüße
Biber
ich denke, es ließe sich ein bisschen zusammendampfen.
Wie wäre es mit folgender Strategie (Beispiel am CMD-Prompt):
(=12:24:00 D:\temp\test\test\1.1\ebene1\unterEbene2\Nochtiefer=)
>for /d %i in (.) do @echo [ÜberOrdner] %~dpi ------------ dieserOrdner[%~nxi]
[ÜberOrdner] D:\temp\test\test\1.1\ebene1\unterEbene2\ ------------ dieserOrdner[Nochtiefer]
Grüße
Biber
Moin Stefan,
vollkommen richtig so.
Als Ergänzung (mit einem Pfadbeispiel, das ich gerade in einem anderen Thread verwendet habe):
--> Du brauchst nicht unbedingt diese Wechselei mit PushD/PopD machen für diese FOR /D -Anweisung.
Grüße und danke für die Blumen
Biber
vollkommen richtig so.
Als Ergänzung (mit einem Pfadbeispiel, das ich gerade in einem anderen Thread verwendet habe):
(=14:05:41 D:\temp\test\test\1.1\ebene1\unterEbene2\Nochtiefer=)
>for /d %i in ("c:\Programme\Ahead\Nero") do @echo [%~dpi] [%~nxi]
[c:\Programme\Ahead\] [Nero]
>for /d %i in ("c:\Programme\Ahead\Nero") do @for /d %j in ("%~dpi\.") do @echo %~dpj ---[%~nxj]
c:\Programme\ ---[Ahead]
--> Du brauchst nicht unbedingt diese Wechselei mit PushD/PopD machen für diese FOR /D -Anweisung.
Grüße und danke für die Blumen
Biber
Auf der Schnelle findet man oben nicht wirklich die konkrete Lösung zum Hauptproblem aus der Titel "Batch-SubRoutine - übergeordneten Ordner-Namen in Variable", d. h. nur den Namen eines Überordners in Variable zu setzen.
Mein Beispiel wäre wie folgt (den Text am besten in eine .bat-Datei einfügen und ausführen):
Nur als "meine 2 Cent dazu".
Vielleicht ist dies jemandem doch nützlich.
Viele Grüße
Nik
Mein Beispiel wäre wie folgt (den Text am besten in eine .bat-Datei einfügen und ausführen):
:>D:\Ebene1\Ebene2\Ebene3\File.exe
for /d %%i in ("%~dp0\File.exe") do (
echo Ordnerpfad: %%~dpi
echo Dateiname: %%~nxi
)
:Ordnerpfad: D:\Ebene1\Ebene2\Ebene3\
:Dateiname: File.exe
echo.
for /d %%i in (.) do (
echo Pafd Überordner: %%~dpi
echo Ordnername: %%~nxi
)
echo.
:Pafd Überordner: D:\Ebene1\Ebene2\
:Ordnername: Ebene3
echo und nochmal das Gleiche nur auf anderer Art:
echo.
for /d %%i in ("%~dp0") do for /d %%j in ("%%~dpi\.") do (
echo Pafd Überordner: %%~dpj
echo Ordnername: %%~nxj
)
:Pafd Überordner: D:\Ebene1\Ebene2\
:Ordnername: Ebene3
echo.
for /d %%i in (..) do (
echo Pafd ÜberÜberordner: %%~dpi
echo Überordnername: %%~nxi
)
echo.
:Pafd ÜberÜberordner: D:\Ebene1\
:Überordnername: Ebene2
Nur als "meine 2 Cent dazu".
Vielleicht ist dies jemandem doch nützlich.
Viele Grüße
Nik