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.

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.


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:?
)

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.


14

Sie sollten das aktuelle Verzeichnis verwenden können

"% CD%" \ bin \ Iris.exe


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)


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.