teil des pfades einer aufgerufenen datei extrahieren
hallo,
ich habe ein kleines problem und hoffe mir kann jemand helfen.
im rahmen eines grösseren skriptes an dem ich zur zeit arbeite bin ich auf ein problem gestossen, bei dem ich im moment nicht weiter komme.
beispiel:
habe eine datei unter c:\ liegen die aufruf.cmd lautet.
aus dieser datei rufe ich per call nun eine datei auf, die unter einem beliebigen dir liegt: call c:\tmp\test\test2.cmd
im rahmen der weiterverarbeitung will ich einen teil des pfades extrahieren und weiter benutzen.
FOR /F "usebackq delims=" %%i IN ('%cd%') DO echo %%~ni funktioniert wenn ich die test2.cmd im aktuellen dir in dem sie liegt aufrufe wunderbar und spuckt mir als ergebnis "test" aus wie gewünscht. wird die datei jedoch von call in einem anderen dir aus aufgerufen funktioniert das ganze schon nicht mehr.
wäre dankbar für einen tipp wie ich es schaffen kann nur den namen des subdirs auszugeben in dem die aufgerufene datei liegt wenn das ganze von call aufgerufen wird.
grüsse urknall
ich habe ein kleines problem und hoffe mir kann jemand helfen.
im rahmen eines grösseren skriptes an dem ich zur zeit arbeite bin ich auf ein problem gestossen, bei dem ich im moment nicht weiter komme.
beispiel:
habe eine datei unter c:\ liegen die aufruf.cmd lautet.
aus dieser datei rufe ich per call nun eine datei auf, die unter einem beliebigen dir liegt: call c:\tmp\test\test2.cmd
im rahmen der weiterverarbeitung will ich einen teil des pfades extrahieren und weiter benutzen.
FOR /F "usebackq delims=" %%i IN ('%cd%') DO echo %%~ni funktioniert wenn ich die test2.cmd im aktuellen dir in dem sie liegt aufrufe wunderbar und spuckt mir als ergebnis "test" aus wie gewünscht. wird die datei jedoch von call in einem anderen dir aus aufgerufen funktioniert das ganze schon nicht mehr.
wäre dankbar für einen tipp wie ich es schaffen kann nur den namen des subdirs auszugeben in dem die aufgerufene datei liegt wenn das ganze von call aufgerufen wird.
grüsse urknall
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 22778
Url: https://administrator.de/forum/teil-des-pfades-einer-aufgerufenen-datei-extrahieren-22778.html
Ausgedruckt am: 18.05.2025 um 12:05 Uhr
9 Kommentare
Neuester Kommentar
Moin urknall,
gibt wie immer im Leben mehrere Möglichkeiten...
Mit der Variablen %cd% kommst Du nicht zum Ziel, weil das aktuelle Verzeichnis ja nach wie vor das Verzeichnis ist, in dem die "aufruf.cmd" steht. Du wechselst es ja nicht.
Also kannst Du es entweder wechseln oder ermittelst Laufwerk und Pfad der aufgerufenen Datei über den Parameter %0.
::---snipp Testbeispiel für die \tmp\test\aufruf.cmd
@echo Para%%0: [%0] Lw/Pfad: [%~dp0]
@for /F "tokens=1-2 delims=\" %%i IN ("%~p0") DO @echo %%i %%j
::---snapp Testbeispiel für die \tmp\test\aufruf.cmd
liefert folgenden Output:
$cmd$ aufruf.cmd
(call tmp\test\test2.cmd)
Para%0: [tmp\test\test2.cmd] Lw/Pfad: [C:\tmp\test\]
tmp test
Wenn ich Dich richtig verstanden habe, willst Du ja den "End"-Pfad, den letzten Zweig des ganzen Pfades extrahieren.
Also auch hier wieder mehrere Möglichkeiten:
a) die ganz unsaubere: Du weißt, dass der Gesamt-Pfad nur zwei Ebenen hat:
@for /F "tokens=2 delims=\" %%i IN ("%~p0") DO @echo 2.Ebene des Pfads: %%i
b) die sauberere Methode
FOR /F "tokens=1-9 delims=\" %%i IN ("%~p0") DO (
For %%a in (%%i %%j %%k %%l %%m %%n %%o %%p %%q) do set "lastpath=%%a"
)
> in der Variablen %lastpath% steht jetzt das letzte Unterverzeichnis (max Verzeichnistiefe=9)
HTH Biber
gibt wie immer im Leben mehrere Möglichkeiten...
Mit der Variablen %cd% kommst Du nicht zum Ziel, weil das aktuelle Verzeichnis ja nach wie vor das Verzeichnis ist, in dem die "aufruf.cmd" steht. Du wechselst es ja nicht.
Also kannst Du es entweder wechseln oder ermittelst Laufwerk und Pfad der aufgerufenen Datei über den Parameter %0.
::---snipp Testbeispiel für die \tmp\test\aufruf.cmd
@echo Para%%0: [%0] Lw/Pfad: [%~dp0]
@for /F "tokens=1-2 delims=\" %%i IN ("%~p0") DO @echo %%i %%j
::---snapp Testbeispiel für die \tmp\test\aufruf.cmd
liefert folgenden Output:
$cmd$ aufruf.cmd
(call tmp\test\test2.cmd)
Para%0: [tmp\test\test2.cmd] Lw/Pfad: [C:\tmp\test\]
tmp test
Wenn ich Dich richtig verstanden habe, willst Du ja den "End"-Pfad, den letzten Zweig des ganzen Pfades extrahieren.
Also auch hier wieder mehrere Möglichkeiten:
a) die ganz unsaubere: Du weißt, dass der Gesamt-Pfad nur zwei Ebenen hat:
@for /F "tokens=2 delims=\" %%i IN ("%~p0") DO @echo 2.Ebene des Pfads: %%i
b) die sauberere Methode
FOR /F "tokens=1-9 delims=\" %%i IN ("%~p0") DO (
For %%a in (%%i %%j %%k %%l %%m %%n %%o %%p %%q) do set "lastpath=%%a"
)
> in der Variablen %lastpath% steht jetzt das letzte Unterverzeichnis (max Verzeichnistiefe=9)
HTH Biber

In Ergänzung zu Bibers Antwort hier noch eine Methode, aus dem kompletten Pfad den Namen des Unterverzeichnisses zu extrahieren, in dem die Batchdatei gespeichert ist:
For %%A In ("%~p0.") Do Echo %%~nA
bzw.
For %%A In ("%~p0.") Do Set lastpath=%%~nA
Getestet unter Windows XP. Verzeichnistiefe egal. Funktioniert auch mich Leerzeichen im Pfad.
Viele Grüße
For %%A In ("%~p0.") Do Echo %%~nA
bzw.
For %%A In ("%~p0.") Do Set lastpath=%%~nA
Getestet unter Windows XP. Verzeichnistiefe egal. Funktioniert auch mich Leerzeichen im Pfad.
Viele Grüße

[...] gibt es irgendwelche seiten, die sich mit sowas beschäftigen [...]
Hier pflege ich eine Linksammlung:
http://www.fpschultze.de/PDlinks+viewcat.cid+1.htm
Viele Grüße
Moin urknall,

Das Handwerkszeug kann man sich schon -da muss ich mal ausnahmsweise fair gegenüber M$ sein- sogar durch Lesen der "Befehlszeilenreferenz von A-Z" in der Windows-Hilfe aneignen. Sind ja keine "undokumentierten Features", die hier gezeigt werden.
Ideen, Beispiele (und auch Irrwege) gibt es auf einigen WebSites - ein paar Linkempfehlungen für "Batch & Shell" siehe unten.
Nur die Transfer-Leistung .... zu sehen, dass dieser und jener Schnipsel vielleicht auch bei Dir passen könnte, aber bei einem ganz anderen Problem.. das bleibt an Dir hängen.
In dieser Beziehung ist Batch schon etwas sehr "Handwerkliches".
10% Inspiration und 90% Transpiration.
(Soll T.A. Edison so ähnlich gesagt haben, allerdings auf ausländisch.)
Gruß Biber
[...] ich werde die methode von frank peter vorziehen [...]
Werde ich auch, jetzt, wo ich die kenne... [...] oder wird sowas dann per brain und wissen zusammengeschachtelt bis man das gewünschte ergebnis [...]
Ja. Darauf läuft es raus.Das Handwerkszeug kann man sich schon -da muss ich mal ausnahmsweise fair gegenüber M$ sein- sogar durch Lesen der "Befehlszeilenreferenz von A-Z" in der Windows-Hilfe aneignen. Sind ja keine "undokumentierten Features", die hier gezeigt werden.
Ideen, Beispiele (und auch Irrwege) gibt es auf einigen WebSites - ein paar Linkempfehlungen für "Batch & Shell" siehe unten.
Nur die Transfer-Leistung .... zu sehen, dass dieser und jener Schnipsel vielleicht auch bei Dir passen könnte, aber bei einem ganz anderen Problem.. das bleibt an Dir hängen.
In dieser Beziehung ist Batch schon etwas sehr "Handwerkliches".
10% Inspiration und 90% Transpiration.
(Soll T.A. Edison so ähnlich gesagt haben, allerdings auf ausländisch.)
Gruß Biber
Moin urknall,
parat nicht und ich hab auch erst heute abend ein wenig Ruhe dafür.
Wäre Dir dankbar, wenn Du hier in "Batch & Shell" einen neuen Thread zu diesem FOR /R- Thema aufmachen würdest mit der Skizze, die Du schon hast.
Bekommen wir aber heute noch feddich...
Grüße Biber
[Edit]
Danke für die schnelle Umsetzung!!!
[/Edit]
parat nicht und ich hab auch erst heute abend ein wenig Ruhe dafür.
Wäre Dir dankbar, wenn Du hier in "Batch & Shell" einen neuen Thread zu diesem FOR /R- Thema aufmachen würdest mit der Skizze, die Du schon hast.
Bekommen wir aber heute noch feddich...
Grüße Biber
[Edit]
Danke für die schnelle Umsetzung!!!
[/Edit]