caminho relativo no script BAT

130

Aqui está a minha própria pasta de programa na minha unidade USB:

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

Eu gostaria de usar run.batpara começar Iris.exe

Não posso usar isso: F:/Program/bin/Iris.execomo um atalho, porque às vezes ele não se conecta como unidade F:( por exemplo, E: ou G:)

O que preciso escrever no arquivo bat para funcionar independentemente da letra da unidade?

Eu tentei isso no arquivo BAT:

"\bin\Iris.exe"

Mas não funciona.

user2083037
fonte

Respostas:

275

Use isso no seu arquivo em lotes:

%~dp0\bin\Iris.exe

%~dp0 resolve para o caminho completo da pasta na qual o script em lote reside.

Ansgar Wiechers
fonte
7
Na verdade, isso resolve algo como C:\myDir\\bin\Iris.exe(observe a barra invertida dupla). Isso ainda funciona, mas deixando de fora a barra invertida antes que o bin pareça estar "mais limpo"? -> %~dp0bin\Iris.exe.
mozzbozz
8
@mozzbozz Se você pode garantir que %~dp0sempre haverá uma barra invertida à direita, as duas instruções funcionarão. Caso contrário, aquele com a barra invertida adicional é a variante mais segura.
Ansgar Wiechers
4
Ok, isso é um ponto. Eu só testei isso em duas máquinas Windows 7 diferentes, pode ser diferente em outros lugares (XP, Vista ou Windwos 8 -> eu não sei, mas: lógica da Microsoft e não consegui encontrar documentos sobre isso;)). No entanto, eu descobri que eu tinha que colocar aspas em torno dele ( "%~dp0\bin\Iris.exe") como o caminho tinha um espaço em branco na mesma :) Só para ter realmente certeza de que funciona em todos os computadores.
mozzbozz
1
você pode garantir que haja uma barra invertida com SET "scriptdir=%~dp0"e na próxima linha IF NOT "%scriptdir:~-1%"=="\" SET "scriptdir=%scriptdir%\". Vi incidentes em que a barra invertida dupla no meio do caminho quebra o software.
LogicDaemon 7/07/19
40

Você pode obter todas as propriedades de arquivo necessárias usando o código abaixo:

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
fonte
24

Eu descobri que %CD%fornece o caminho do qual o script foi chamado e não o caminho do script, no entanto, %~dp0fornecerá o caminho do próprio script.

Sitri
fonte
14

Você deve poder usar o diretório atual

"% CD%" \ bin \ Iris.exe

Johan A.
fonte
1
Isso falha quando o diretório atual não é Program, isso acontece quando você clica duas vezes run.batno explorer. %CD%é o diretório atual %~dp0é o diretório do próprio arquivo em lotes
jeb
5

quer bin\Iris.exe (sem barra inicial - porque isso significa começar desde a raiz)
ou \Program\bin\Iris.exe(caminho completo)

AjV Jsy
fonte
1
bin \ Iris.exe não está funcionando :( Eu não gosto de usar root, porque um dia talvez eu mova esse diretório para outro local. E se eu perguntar ao SO o caminho absoluto atual? e usarei que para começar exe no bin?
user2083037
Presumi que a unidade atual seria a unidade do pendrive e a pasta atual seria \Program- não é esse o caso? Você pode mostrar que com um simples cdcomando na linha antes de tentar executar o .exe
AJV JSY
Simplesmente usar um caminho relativo não funcionará necessariamente. O caminho será relativo ao diretório de trabalho atual, que pode ser diferente do diretório pai de run.bat.
Ansgar Wiechers