Position einer Datei mittels Bat bestimmen
Hallo!
Kann man die Position einer Datei bestimmen?
Die Datei test.exe befindet sich auf einem Laufwerk in einem Ordner, welche beide nicht bekannt sind, im gleichen Ordner befindet sich auch test.ini. Die EXE soll nun feststellen in welchen Ordner sich die EXE befindet und den Pfad zwichen speichern um die test.ini zufinden.
Das soll alles nach möglichkeit in der test.exe stattfinden!
Oder hat jemand eine andere Lösung für mein Problem?
Hab eine Bat->Exe geschrieben welche Daten aus einer Ini im gleichen Ordner wie die Exe holt.
Ich möchte diese mit dem VPN Novell Client starten welcher das ausführen nach dem Verbinden unterstützt, jedoch kann ich kein "Ausführen in - Ziel" angeben wie es zum beispiel bei normalen Verküpfungen funktioniert.
zB
Hoffe irgend jemand hat eine Lösung.
Danke im Voraus!
JK
Kann man die Position einer Datei bestimmen?
Die Datei test.exe befindet sich auf einem Laufwerk in einem Ordner, welche beide nicht bekannt sind, im gleichen Ordner befindet sich auch test.ini. Die EXE soll nun feststellen in welchen Ordner sich die EXE befindet und den Pfad zwichen speichern um die test.ini zufinden.
Das soll alles nach möglichkeit in der test.exe stattfinden!
Oder hat jemand eine andere Lösung für mein Problem?
Hab eine Bat->Exe geschrieben welche Daten aus einer Ini im gleichen Ordner wie die Exe holt.
Ich möchte diese mit dem VPN Novell Client starten welcher das ausführen nach dem Verbinden unterstützt, jedoch kann ich kein "Ausführen in - Ziel" angeben wie es zum beispiel bei normalen Verküpfungen funktioniert.
zB
Hoffe irgend jemand hat eine Lösung.
Danke im Voraus!
JK
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 17796
Url: https://administrator.de/forum/position-einer-datei-mittels-bat-bestimmen-17796.html
Ausgedruckt am: 26.12.2024 um 13:12 Uhr
24 Kommentare
Neuester Kommentar
Hi,
sorry, aber ich verstehe nicht so ganz, was du möchtest!
Du möchtest das Verzeichnis einer Datei namens test.exe finden?
Anhand dieser Pfadangabe weißt du wo die test.ini liegt? - Warum nicht gleich nach der test.ini suchen?
Dann soll der VPN Client beim starten die test.exe ausführen?
Erklär mal etwas näher bzw. verständlicher! Oder bin nur ich verwirrt?
Psycho
sorry, aber ich verstehe nicht so ganz, was du möchtest!
Du möchtest das Verzeichnis einer Datei namens test.exe finden?
Anhand dieser Pfadangabe weißt du wo die test.ini liegt? - Warum nicht gleich nach der test.ini suchen?
Dann soll der VPN Client beim starten die test.exe ausführen?
Erklär mal etwas näher bzw. verständlicher! Oder bin nur ich verwirrt?
Psycho
Hallo,
also wenn ich das richtig verstanden habe, hast Du aus einer BAT eine EXE gemacht und Du möchtest jetzt wissen, mit welchem Batch-Befehl man herausfinden kann, in welchem Verzeichnis die BAT/EXE jetzt ist, richtig?
Der Befehl heißt einfach: cd (ohne Punkte, etc.).
Liefert das aktuelle Arbeitsverzeichnis als String zurück.
Gruß,
Tim
also wenn ich das richtig verstanden habe, hast Du aus einer BAT eine EXE gemacht und Du möchtest jetzt wissen, mit welchem Batch-Befehl man herausfinden kann, in welchem Verzeichnis die BAT/EXE jetzt ist, richtig?
Der Befehl heißt einfach: cd (ohne Punkte, etc.).
Liefert das aktuelle Arbeitsverzeichnis als String zurück.
Gruß,
Tim
Hallo Jörg,
wenn ich dich richtig verstehe möchtest du eine Verzeichnisstrutur rekursiv nach einer bestimmten Datei durchsuchen und das übergeordnete Verzeichnis dieses Pfades in einen Link als WorkDir eintragen.
Dafür ist cd nicht geeignet, das liefert nur das aktuelle Verzeichnis zurück.
Wenn es mit BAT gelöst werden muss, sieh dir die Beiträge von Biber an!
Ein VBScript das Verzeichnisse rekursiv durchläuft findest du hier:
Finden von Office-Dateien mit Schreibschutz
Muss halt noch ein wenig umbauen, ist aber nicht schwer.
On Error Resume Next ist in diesem Script zwingend notwendig, da sonst in Verzeichnissen für die keine Rechte bestehen (bspw. System Volume Information) Fehler erzeugt werden.
Wenn die Datei gefunden wurde, kannst du mit dem Befehl ParentFolder des FileSystemObjects den übergeordneten Ordner ermitteln.
Eine Erläuterung wie man Links per Script erstellt, verteilt und bearbeitet inkl. entspr. VBScripte findest du auf den Seiten von Roland Weisskopf, EagleSoft Ltd.
http://mypage.bluewin.ch/eaglesoft/infopages/vbs/vbsshort.htm
Ich hoffe das hilft dir ein wenig weiter.
gemini
wenn ich dich richtig verstehe möchtest du eine Verzeichnisstrutur rekursiv nach einer bestimmten Datei durchsuchen und das übergeordnete Verzeichnis dieses Pfades in einen Link als WorkDir eintragen.
Dafür ist cd nicht geeignet, das liefert nur das aktuelle Verzeichnis zurück.
Wenn es mit BAT gelöst werden muss, sieh dir die Beiträge von Biber an!
Ein VBScript das Verzeichnisse rekursiv durchläuft findest du hier:
Finden von Office-Dateien mit Schreibschutz
Muss halt noch ein wenig umbauen, ist aber nicht schwer.
On Error Resume Next ist in diesem Script zwingend notwendig, da sonst in Verzeichnissen für die keine Rechte bestehen (bspw. System Volume Information) Fehler erzeugt werden.
Wenn die Datei gefunden wurde, kannst du mit dem Befehl ParentFolder des FileSystemObjects den übergeordneten Ordner ermitteln.
Eine Erläuterung wie man Links per Script erstellt, verteilt und bearbeitet inkl. entspr. VBScripte findest du auf den Seiten von Roland Weisskopf, EagleSoft Ltd.
http://mypage.bluewin.ch/eaglesoft/infopages/vbs/vbsshort.htm
Ich hoffe das hilft dir ein wenig weiter.
gemini
Moin Jk87,
die Funktionalität, die Du suchst, bekommst Du über den (immer vorhandenden) Parameter %0.
Wenn Du testweise in Deiner Bat-Datei einbaust:
@echo Name der Datei: %0
...bekommst Du Namen und Pfad geliefert, z.B. "d:\test\beispiel"
Du kannst es noch verfeinern als (einen oder mehrere Buchstaben von)
%~dpnxtz0 ... d wie drive, p wie path, n wie name, x wie eXtension, z wie siZe, t wie dateTime..
Was Du also brauchst, sind Drive und Path, also d und p.
~~~~...
set Verzeichnis=%~dp0
echo Verzeichnis der Bat-Datei %verzeichnis%, aktuelles Verzeichnis ist %cd%
~~~..
Sollte das liefern, was Du haben willst.
Das oben in den ersten Posts beschriebene %cd% (bzw. die Abfrage des Befehls "cd") liefert schon das Richtige, nämlich das Verzeichnis, von dem Du aufrufst. Also den Desktop.
HTH und Greetz
Biber
[Edit] Parameter n hatte ich vergessen.. braucht man/frau auch gelegentlich. [/Edit]
die Funktionalität, die Du suchst, bekommst Du über den (immer vorhandenden) Parameter %0.
Wenn Du testweise in Deiner Bat-Datei einbaust:
@echo Name der Datei: %0
...bekommst Du Namen und Pfad geliefert, z.B. "d:\test\beispiel"
Du kannst es noch verfeinern als (einen oder mehrere Buchstaben von)
%~dpnxtz0 ... d wie drive, p wie path, n wie name, x wie eXtension, z wie siZe, t wie dateTime..
Was Du also brauchst, sind Drive und Path, also d und p.
~~~~...
set Verzeichnis=%~dp0
echo Verzeichnis der Bat-Datei %verzeichnis%, aktuelles Verzeichnis ist %cd%
~~~..
Sollte das liefern, was Du haben willst.
Das oben in den ersten Posts beschriebene %cd% (bzw. die Abfrage des Befehls "cd") liefert schon das Richtige, nämlich das Verzeichnis, von dem Du aufrufst. Also den Desktop.
HTH und Greetz
Biber
[Edit] Parameter n hatte ich vergessen.. braucht man/frau auch gelegentlich. [/Edit]
@Biber
Ich habe es so verstanden, dass das Script eine Datei suchen muss.
Diese Datei "... befindet sich auf einem Laufwerk in einem Ordner, welche beide nicht bekannt sind,..."
In diesem Fall würde %0 nicht weiterhelfen, genausowenig wie cd, weil ja bei beiden das Verzeichnis bekannt sein und die Batch darin gestartet werden müsste.
Oder versteh ich da was falsch *grübel*
So wirklich leichtverständlich, zuminest für Leute in meinem Alter, ist das Posting ja nicht
gemini
@echo Name der Datei: %0
...bekommst Du Namen und Pfad geliefert,
z.B. "d:\test\beispiel"
%0 liefert das aktuelle Verzeichnis zurück, vgl. pwd...bekommst Du Namen und Pfad geliefert,
z.B. "d:\test\beispiel"
Ich habe es so verstanden, dass das Script eine Datei suchen muss.
Diese Datei "... befindet sich auf einem Laufwerk in einem Ordner, welche beide nicht bekannt sind,..."
In diesem Fall würde %0 nicht weiterhelfen, genausowenig wie cd, weil ja bei beiden das Verzeichnis bekannt sein und die Batch darin gestartet werden müsste.
Oder versteh ich da was falsch *grübel*
So wirklich leichtverständlich, zuminest für Leute in meinem Alter, ist das Posting ja nicht
gemini
@gemini
Hmmm... *auch am Kopf kratzt
Also, wenn die *.Exe was-auch-immer macht, muss sie aufgerufen werden.
Also z.B. im Suchpfad %path% stehen. Das wäre ein Fall, in dem die *.Exe läuft, ohne dass ich vorher weiß, in welchem Verzeichnis sie steht.
Aber ist ein bisschen unklar ausgedrückt... vielleicht schwankt JK87 noch zwischen Admin- und Politiker-Laufbahn.
@JK87: Kannst Du noch mal bitte die Anforderung umformulieren?
Wenn ich es falsch verstanden habe und der Pfad der "Test.ini" das ausschlaggebende ist, wäre natürlich ein anderer Oneliner sinnvoll (eine FOR /R ...IN..DO-Schleife, also eine rekursive Suche, wie gemini schon geschrieben hat).
Biber
[Edit] @gemini
[/Edit]
Hmmm... *auch am Kopf kratzt
Die Datei test.exe befindet sich auf einem Laufwerk in einem Ordner, welche beide nicht
bekannt sind, im gleichen Ordner befindet sich auch test.ini. Die EXE soll nun feststellen
in welchen Ordner sich die EXE befindet und den Pfad zwichen speichern um die test.ini
zufinden.
Das soll alles nach möglichkeit in der test.exe stattfinden!
bekannt sind, im gleichen Ordner befindet sich auch test.ini. Die EXE soll nun feststellen
in welchen Ordner sich die EXE befindet und den Pfad zwichen speichern um die test.ini
zufinden.
Das soll alles nach möglichkeit in der test.exe stattfinden!
Also, wenn die *.Exe was-auch-immer macht, muss sie aufgerufen werden.
Also z.B. im Suchpfad %path% stehen. Das wäre ein Fall, in dem die *.Exe läuft, ohne dass ich vorher weiß, in welchem Verzeichnis sie steht.
Aber ist ein bisschen unklar ausgedrückt... vielleicht schwankt JK87 noch zwischen Admin- und Politiker-Laufbahn.
@JK87: Kannst Du noch mal bitte die Anforderung umformulieren?
Wenn ich es falsch verstanden habe und der Pfad der "Test.ini" das ausschlaggebende ist, wäre natürlich ein anderer Oneliner sinnvoll (eine FOR /R ...IN..DO-Schleife, also eine rekursive Suche, wie gemini schon geschrieben hat).
Biber
[Edit] @gemini
So wirklich leichtverständlich, zuminest für Leute in meinem Alter, ist das Posting ja nicht
Selbst für jüngere und vitalere wie mich ist es schwierig [/Edit]
@Biber
Dann ist es also nicht beginnende Altersenilität sondern nur der normale geistige Abbau bei über 30-jährigen
Selbst für jüngere und vitalere wie mich ist es schwierig [/Edit]
Das beruhigt mich ungemein. PuuhhDann ist es also nicht beginnende Altersenilität sondern nur der normale geistige Abbau bei über 30-jährigen
Moin, Jörg,
ich würde es wirklich erst so versuchen wie oben beschrieben.
~~~~...
set Verzeichnis=%~dp0
echo Verzeichnis der Bat-Datei %verzeichnis%, aktuelles Verzeichnis ist %cd%
~~~..
Sollte das, warum auch immer nicht klappen, dann wäre die nächst-aufwändigere Strategie, tatsächlich diese Datei zu suchen... mit FOR /R..IN.. DO oder was-auch-immer.
Oder (wie es ja auch viele Applikationen machen) darauf zu bestehen, dass der Pfad der *.ini-Datei in einer Umgebungsvariablen definiert sein muss/in der Registry zu finden ist.
Aber so etwas wäre für mich immer nur Plan B.
Funktioniert denn der Weg oben über "%~dp0" bei Dir nicht?
Grüße
Frank / der Biber aus Bremen
ich würde es wirklich erst so versuchen wie oben beschrieben.
~~~~...
set Verzeichnis=%~dp0
echo Verzeichnis der Bat-Datei %verzeichnis%, aktuelles Verzeichnis ist %cd%
~~~..
Sollte das, warum auch immer nicht klappen, dann wäre die nächst-aufwändigere Strategie, tatsächlich diese Datei zu suchen... mit FOR /R..IN.. DO oder was-auch-immer.
Oder (wie es ja auch viele Applikationen machen) darauf zu bestehen, dass der Pfad der *.ini-Datei in einer Umgebungsvariablen definiert sein muss/in der Registry zu finden ist.
Aber so etwas wäre für mich immer nur Plan B.
Funktioniert denn der Weg oben über "%~dp0" bei Dir nicht?
Grüße
Frank / der Biber aus Bremen
Tja, Jörg,
dann wird diese wohl so arbeiten, dass sie zwar als *.exe gestartet wird, aber den "eigentlich" auszuführenden Originalbatch wirder 1:1 im %temp%-Verzeichnis erzeugt und anschließend weglöscht.
Wenn Du also aus irgendwelchen Gründen eine *.exe haben willst/musst... dann fürchte ich, musst Du den Weg über Umgebungsvariable"MeinInstVerzeichnis" oder einen Reg-Eintrag gehen. Als purer Batch würde es wohl funktionieren.
Oder die Test.ini (oder wie sie halt heißen mag) tatsächlich suchen. Aber das Suchen ist natürlich am fehlerträchtigsten - kann ja immer mehrere Dateien mit diesem Namen geben.
Auf wie vielen Rechnern läuft denn die Anwendung? Und sind das alles für Dich erreichbare Clients?
Biber
dann wird diese wohl so arbeiten, dass sie zwar als *.exe gestartet wird, aber den "eigentlich" auszuführenden Originalbatch wirder 1:1 im %temp%-Verzeichnis erzeugt und anschließend weglöscht.
Wenn Du also aus irgendwelchen Gründen eine *.exe haben willst/musst... dann fürchte ich, musst Du den Weg über Umgebungsvariable"MeinInstVerzeichnis" oder einen Reg-Eintrag gehen. Als purer Batch würde es wohl funktionieren.
Oder die Test.ini (oder wie sie halt heißen mag) tatsächlich suchen. Aber das Suchen ist natürlich am fehlerträchtigsten - kann ja immer mehrere Dateien mit diesem Namen geben.
Auf wie vielen Rechnern läuft denn die Anwendung? Und sind das alles für Dich erreichbare Clients?
Biber
Tja, hinterlegst Du denn den Inst-Pfad bei der Installation irgendwo in der Registry?
Das wäre ja das nächst elegantere...
Sonst sind wir wieder bei wackeligen Lösungen...
Angelehnt an das obige Bildchen wäre denkbar eine Prüfung a la
...
set "testIni="
if exist "%ProgramFiles%\VideoLan\test.ini" set "testini=%ProgramFiles%\VideoLan\test.ini"
...
Das wäre ja das nächst elegantere...
Sonst sind wir wieder bei wackeligen Lösungen...
Angelehnt an das obige Bildchen wäre denkbar eine Prüfung a la
...
set "testIni="
if exist "%ProgramFiles%\VideoLan\test.ini" set "testini=%ProgramFiles%\VideoLan\test.ini"
...
Ja, das hört sich schon besser an..
Du kannst das nach dem Muster dann schnell abprüfen (das Beispiel hatte tim.frodermann heute in einem anderen Beitrag Drucker aus Registry mittels Batchdatei auslesen )
@echo OFF
set "RegKey=HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices"
:: Delims ist ein Tab gefolgt von einem Leerzeichen
FOR /F "TOKENS=2* DELIMS= " %%A IN ('REG QUERY "%regKey%"') DO SET Drucker=%%B
ECHO %regkey%=%Drucker%
~~~~
Musst bloß Deinen RegKey wissen...
Biber
Du kannst das nach dem Muster dann schnell abprüfen (das Beispiel hatte tim.frodermann heute in einem anderen Beitrag Drucker aus Registry mittels Batchdatei auslesen )
@echo OFF
set "RegKey=HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices"
:: Delims ist ein Tab gefolgt von einem Leerzeichen
FOR /F "TOKENS=2* DELIMS= " %%A IN ('REG QUERY "%regKey%"') DO SET Drucker=%%B
ECHO %regkey%=%Drucker%
~~~~
Musst bloß Deinen RegKey wissen...
Biber
Nachtrag:
1. Hatte die Links vorhin nicht griffbereit bzw. anderes zu tun.
tim.frodermann hat mal ein ganz nettes Tutorial zu dem Thema Die Windows-Registry mit reg-Dateien bearbeiten geschrieben. Hilft bestimmt.
2. Und - mein Fehler vorhin - Du kannst natürlich bei Deinen unbekannten Anwendern nicht voraussetzen, dass die eine Reg.exe haben.
Also musst Du über mit 'RegEdit.exe /e "%temp%\jk.reg" ...' eine Textdatei erzeugen und die mit "find" durchflöhen.
Dazu hab ich <a href= target="blank">im Teil III meines Batch-Workshops</a> ein Beispiel.
HTH Biber
1. Hatte die Links vorhin nicht griffbereit bzw. anderes zu tun.
tim.frodermann hat mal ein ganz nettes Tutorial zu dem Thema Die Windows-Registry mit reg-Dateien bearbeiten geschrieben. Hilft bestimmt.
2. Und - mein Fehler vorhin - Du kannst natürlich bei Deinen unbekannten Anwendern nicht voraussetzen, dass die eine Reg.exe haben.
Also musst Du über mit 'RegEdit.exe /e "%temp%\jk.reg" ...' eine Textdatei erzeugen und die mit "find" durchflöhen.
Dazu hab ich <a href= target="blank">im Teil III meines Batch-Workshops</a> ein Beispiel.
HTH Biber
@JK87
...das ist aber lumpig von den WinRarSfx-Codern...
Da hätte ich aber Verbesserungsvorschläge *kopfschüttelt
Tja, dann bleiben Dir noch eine simple, eine umständliche, eine unsichere und eine benutzerunfreundliche Strategie:
1. Die Simple:
Schreibe bei der Installation mit RegEdit (notfalls liefere eine *reg-Datei mit) irgendwo in die Registry HKCU einen Schlüssel, den Du wiederfindest. Mit dem Inst-Pfad. Fertig. Dein InstProg müllt doch eh in die Registry rein.
2.Die Umständliche
Bei der Installation eine dauerhafte Umgebungsvariable setzen.
Set "ProxyOnOffDir=x:\PfadZumProg"
... aber da brauchst Du auch wieder entweder "PathMan.exe" aus dem ResKit ODER Du schreibst es in die Registry in den User-Path... dann klappt es erst nach Neustart.
Da ist selbst Methode 1 eleganter. Und unsicher ist es auch ...
3. Die mit Abstand unsicherste Methode
Alle (lokalen) Laufwerke absuchen nach Deiner "*.ini"... mit FOR /R...IN..DO.
Da gibt es unter "Suchen nach pst-Dateien" ein paar Beiträge..
Aber das klappt nur halbwegs zuverlässig, wenn Deine Ini-Datei einen relativ exotischen Namen hat. Wenn da zwei gleichnamige Dateien gefunden werden, stehst Du wieder dumm da.
4. Die benutzerunfreundliche Methode
Prompten nach dem Pfad. Mit "Set /P " oder einer Messagebox...
Aber das verzeiht Dir kein Anwender... ist nur eine hypothetische Möglichkeit.
Mehr fällt mir aus dem Stand nicht ein... aber vielleicht hat jemand anders noch eine Idee.
Grüße
Biber
...das ist aber lumpig von den WinRarSfx-Codern...
Da hätte ich aber Verbesserungsvorschläge *kopfschüttelt
Tja, dann bleiben Dir noch eine simple, eine umständliche, eine unsichere und eine benutzerunfreundliche Strategie:
1. Die Simple:
Schreibe bei der Installation mit RegEdit (notfalls liefere eine *reg-Datei mit) irgendwo in die Registry HKCU einen Schlüssel, den Du wiederfindest. Mit dem Inst-Pfad. Fertig. Dein InstProg müllt doch eh in die Registry rein.
2.Die Umständliche
Bei der Installation eine dauerhafte Umgebungsvariable setzen.
Set "ProxyOnOffDir=x:\PfadZumProg"
... aber da brauchst Du auch wieder entweder "PathMan.exe" aus dem ResKit ODER Du schreibst es in die Registry in den User-Path... dann klappt es erst nach Neustart.
Da ist selbst Methode 1 eleganter. Und unsicher ist es auch ...
3. Die mit Abstand unsicherste Methode
Alle (lokalen) Laufwerke absuchen nach Deiner "*.ini"... mit FOR /R...IN..DO.
Da gibt es unter "Suchen nach pst-Dateien" ein paar Beiträge..
Aber das klappt nur halbwegs zuverlässig, wenn Deine Ini-Datei einen relativ exotischen Namen hat. Wenn da zwei gleichnamige Dateien gefunden werden, stehst Du wieder dumm da.
4. Die benutzerunfreundliche Methode
Prompten nach dem Pfad. Mit "Set /P " oder einer Messagebox...
Aber das verzeiht Dir kein Anwender... ist nur eine hypothetische Möglichkeit.
Mehr fällt mir aus dem Stand nicht ein... aber vielleicht hat jemand anders noch eine Idee.
Grüße
Biber