ruta relativa en el script BAT

130

Aquí está mi propia carpeta de programa en mi unidad USB:

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

Me gustaría usar run.batpara comenzar Iris.exe

No puedo usar esto: F:/Program/bin/Iris.execomo un acceso directo, porque a veces no se adjunta como unidad F:( por ejemplo, E: o G:)

¿Qué necesito escribir en el archivo bat para trabajar independientemente de la letra de la unidad?

Intenté esto en el archivo BAT:

"\bin\Iris.exe"

Pero no funciona.

usuario2083037
fuente

Respuestas:

275

Use esto en su archivo por lotes:

%~dp0\bin\Iris.exe

%~dp0 se resuelve en la ruta completa de la carpeta en la que reside el script por lotes.

Ansgar Wiechers
fuente
77
En realidad, esto se resuelve en algo como C:\myDir\\bin\Iris.exe(tenga en cuenta la doble barra invertida). ¿Esto todavía funciona pero dejando de lado la barra invertida antes de que bin parezca "más limpio"? -> %~dp0bin\Iris.exe.
mozzbozz
8
@mozzbozz Si puede garantizar que %~dp0siempre tendrá una barra invertida final, ambas declaraciones funcionarán. De lo contrario, el que tiene la barra diagonal inversa adicional es la variante más segura.
Ansgar Wiechers
44
Ok, ese es un punto. Solo he probado esto en dos máquinas con Windows 7 diferentes, podría ser diferente en otros lugares (XP, Vista o Windwos 8 -> No lo sé pero: lógica de Microsoft y no pude encontrar ningún documento al respecto;)). Sin embargo, descubrí que tenía que poner comillas alrededor ( "%~dp0\bin\Iris.exe") ya que la ruta tenía un espacio en blanco :) Solo para estar realmente seguro de que funciona en todas las computadoras.
mozzbozz
1
puede asegurarse de que haya una barra diagonal inversa con SET "scriptdir=%~dp0"y en la siguiente línea IF NOT "%scriptdir:~-1%"=="\" SET "scriptdir=%scriptdir%\". He visto incidentes en los que la doble barra diagonal inversa en el medio del camino rompe el software.
LogicDaemon
40

Puede obtener todas las propiedades de archivo requeridas utilizando el siguiente código:

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

He descubierto que %CD%proporciona la ruta desde la que se llamó el script y no la ruta del script, sin embargo, %~dp0dará la ruta del script en sí.

Sitri
fuente
14

Debería poder usar el directorio actual

"% CD%" \ bin \ Iris.exe

Johan A.
fuente
1
Esto falla cuando el directorio actual no lo es Program, esto sucederá cuando haga doble clic run.baten el explorador. %CD%es el directorio actual %~dp0es el directorio del archivo por lotes en sí mismo
jeb
5

ya sea bin\Iris.exe (sin barra inclinada, porque eso significa comenzar desde la raíz)
o \Program\bin\Iris.exe(ruta completa)

AjV Jsy
fuente
1
bin \ Iris.exe no funciona :( No me gusta usar root, porque algún día tal vez mueva este directorio a otra ubicación. ¿Y si le pregunto al sistema operativo la ruta absoluta actual? y usaré que iniciar exe en bin?
user2083037
Supuse que la unidad actual sería la unidad de memoria USB y la carpeta actual sería \Program, ¿no es así? Puede mostrar eso con un simple cdcomando en la línea antes de intentar ejecutar el .exe
AjV Jsy
Simplemente usar una ruta relativa no necesariamente funcionará. La ruta será relativa al directorio de trabajo actual, que puede ser diferente del directorio principal de run.bat.
Ansgar Wiechers