relativer Pfad im BAT-Skript

130

Hier ist mein eigener Programmordner auf meinem USB-Laufwerk:

Program\
     run.bat
     bin\
         config.ini
         Iris.exe
         library.dll
         etc.

Ich würde gerne run.batanfangen Iris.exe

Ich kann dies nicht verwenden: F:/Program/bin/Iris.exewie eine Verknüpfung, da sie manchmal nicht als Laufwerk angehängt wird F:( z. B. E: oder G:)

Was muss ich in die Bat-Datei schreiben, um unabhängig vom Laufwerksbuchstaben zu arbeiten?

Ich habe dies in der BAT-Datei versucht:

"\bin\Iris.exe"

Aber es funktioniert nicht.

user2083037
quelle

Antworten:

275

Verwenden Sie dies in Ihrer Batch-Datei:

%~dp0\bin\Iris.exe

%~dp0 wird in den vollständigen Pfad des Ordners aufgelöst, in dem sich das Batch-Skript befindet.

Ansgar Wiechers
quelle
7
Tatsächlich löst sich dies in etwa auf C:\myDir\\bin\Iris.exe(beachten Sie den doppelten Backslash). Dies funktioniert immer noch, aber den Backslash wegzulassen, bevor bin "sauberer" zu sein scheint? -> %~dp0bin\Iris.exe.
Mozzbozz
8
@mozzbozz Wenn Sie garantieren können, dass %~dp0es immer einen abschließenden Backslash gibt, funktionieren beide Anweisungen. Ansonsten ist der mit dem zusätzlichen Backslash die sicherere Variante.
Ansgar Wiechers
4
Ok, das ist ein Punkt. Ich habe dies nur auf zwei verschiedenen Windows 7-Computern getestet, möglicherweise anderswo anders (XP, Vista oder Windwos 8 -> Ich weiß nicht, aber: Microsoft-Logik und ich konnte keine Dokumente darüber finden;)). Ich stellte jedoch fest, dass ich Anführungszeichen setzen musste ( "%~dp0\bin\Iris.exe"), da der Pfad ein Leerzeichen enthielt :) Nur um wirklich sicher zu sein, dass er auf jedem Computer funktioniert.
Mozzbozz
1
Sie können sicherstellen, dass mit SET "scriptdir=%~dp0"und in der nächsten Zeile ein Backslash vorhanden ist IF NOT "%scriptdir:~-1%"=="\" SET "scriptdir=%scriptdir%\". Ich habe Vorfälle gesehen, bei denen ein doppelter Backslash in der Mitte des Pfads die Software unterbricht.
LogicDaemon
40

Sie können alle erforderlichen Dateieigenschaften mithilfe des folgenden Codes abrufen:

FOR %%? IN (file_to_be_queried) DO (
    ECHO File Name Only       : %%~n?
    ECHO File Extension       : %%~x?
    ECHO Name in 8.3 notation : %%~sn?
    ECHO File Attributes      : %%~a?
    ECHO Located on Drive     : %%~d?
    ECHO File Size            : %%~z?
    ECHO Last-Modified Date   : %%~t?
    ECHO Parent Folder        : %%~dp?
    ECHO Fully Qualified Path : %%~f?
    ECHO FQP in 8.3 notation  : %%~sf?
    ECHO Location in the PATH : %%~dp$PATH:?
)
Gaurav Kolarkar_InfoCepts
quelle
24

Ich habe festgestellt, dass %CD%der Pfad, von dem aus das Skript aufgerufen wurde, und nicht der Pfad des Skripts %~dp0den Pfad des Skripts selbst angibt.

Sitri
quelle
14

Sie sollten das aktuelle Verzeichnis verwenden können

"% CD%" \ bin \ Iris.exe

Johan A.
quelle
1
Dies schlägt fehl, wenn das aktuelle Verzeichnis nicht vorhanden Programist. Dies geschieht, wenn Sie run.batim Explorer auf das doppelklicken. %CD%ist das aktuelle Verzeichnis %~dp0ist das Verzeichnis der Batch-Datei selbst
jeb
5

entweder bin\Iris.exe (kein führender Schrägstrich - denn das bedeutet, dass Sie direkt von der Wurzel aus beginnen)
oder \Program\bin\Iris.exe(vollständiger Pfad)

AjV Jsy
quelle
1
bin \ Iris.exe funktioniert nicht :( Ich verwende root nicht gerne, weil ich dieses Verzeichnis vielleicht eines Tages an einen anderen Ort verschieben werde. Und was ist, wenn ich vom Betriebssystem nach dem aktuellen absoluten Pfad frage? Und ich werde verwenden das, um exe in bin zu starten?
user2083037
Ich nahm an, dass das aktuelle Laufwerk das Laufwerk des USB-Sticks ist und der aktuelle Ordner \Program- ist das nicht der Fall? Sie können dies mit einem einfachen cdBefehl in der Zeile zeigen, bevor Sie versuchen, die .exe
AjV Jsy
Die einfache Verwendung eines relativen Pfads funktioniert nicht unbedingt. Der Pfad ist relativ zum aktuellen Arbeitsverzeichnis, das sich möglicherweise vom übergeordneten Verzeichnis von unterscheidet run.bat.
Ansgar Wiechers