относительный путь в BAT-скрипте

130

Вот моя собственная папка с программой на моем USB-накопителе:

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

Я хотел бы использовать run.batдля начала Iris.exe

Я не могу использовать это: F:/Program/bin/Iris.exeкак ярлык, потому что иногда он не подключается как диск F:( например, E: или G:)

Что мне нужно написать в bat-файле, чтобы он работал независимо от буквы диска?

Я пробовал это в файле BAT:

"\bin\Iris.exe"

Но это не работает.

user2083037
источник

Ответы:

276

Используйте это в своем командном файле:

%~dp0\bin\Iris.exe

%~dp0 разрешает полный путь к папке, в которой находится пакетный сценарий.

Ансгар Вихерс
источник
7
На самом деле это сводится к чему-то вроде C:\myDir\\bin\Iris.exe(обратите внимание на двойную обратную косую черту). Это все еще работает, но если убрать обратную косую черту до того, как bin кажется «чище»? -> %~dp0bin\Iris.exe.
mozzbozz 05
8
@mozzbozz Если вы можете гарантировать, что %~dp0в конце всегда будет обратная косая черта, оба оператора будут работать. В противном случае вариант с дополнительной обратной косой чертой будет более безопасным.
Ансгар Вичерс
4
Хорошо, в том-то и дело. Я тестировал это только на двух разных машинах с Windows 7, может отличаться в другом месте (XP, Vista или Windwos 8 -> я не знаю, но: логика Microsoft, и я не смог найти никаких документов по этому поводу;)). Тем не менее, я обнаружил , что я должен был поставить в кавычки ( "%~dp0\bin\Iris.exe") , поскольку путь был пробел в нем :) Просто , чтобы быть действительно уверены , что он работает на каждом компьютере.
mozzbozz
1
вы можете убедиться, что SET "scriptdir=%~dp0"на следующей строке есть обратная косая черта IF NOT "%scriptdir:~-1%"=="\" SET "scriptdir=%scriptdir%\". Я видел случаи, когда двойная обратная косая черта в середине пути нарушала программное обеспечение.
LogicDaemon 07
40

Вы можете получить все необходимые свойства файла, используя приведенный ниже код:

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:?
)
Гаурав Коларкар_InfoCepts
источник
24

Я обнаружил, что %CD%это путь, из которого был вызван сценарий, а не путь к сценарию, однако %~dp0он дает путь к самому сценарию.

Sitri
источник
14

Вы должны иметь возможность использовать текущий каталог

"% CD%" \ Bin \ Iris.exe

Йохан А.
источник
1
Это не сработает, если текущий каталог не Programбудет, это произойдет, если вы дважды щелкните значок run.batв проводнике. %CD%это текущий каталог %~dp0- это каталог самого командного файла
jeb
5

либо bin\Iris.exe (без ведущей косой черты - потому что это означает начало прямо с корня),
либо \Program\bin\Iris.exe(полный путь)

AjV Jsy
источник
1
bin \ Iris.exe он не работает :( Я не люблю использовать root, потому что когда-нибудь, возможно, я перенесу этот каталог в другое место. А что, если я спрошу у ОС текущий абсолютный путь? и я буду использовать что запустить exe в bin?
user2083037
Я предположил, что текущий диск будет USB-накопителем, а текущая папка будет \Program- это не так? Вы можете показать это с помощью простой cdкоманды в строке, прежде чем пытаться запустить .exe
AjV Jsy
Простое использование относительного пути не обязательно сработает. Путь будет относиться к текущему рабочему каталогу, который может отличаться от родительского каталога run.bat.
Ансгар Вичерс