¿Cómo obtener la ruta del script por lotes en Windows?

329

Sé que %0contiene la ruta completa de la secuencia de comandos por lotes, por ejemploc:\path\to\my\file\abc.bat

Yo sería pathigual ac:\path\to\my\file

¿Cómo podría lograr eso?

Misha Moroshko
fuente
2
posible duplicado del script de línea
Kevin Gosse
1
Por cierto:% 0 no contiene la ruta completa si se llama al murciélago con una línea de comando relativa. Entonces "% ~ dpf0" sería más confiable para este caso.
Eckes

Respuestas:

563

%~dp0será el directorio Aquí hay alguna documentación sobre todos los modificadores de ruta . Cosas divertidas :-)

Para eliminar la barra invertida final, puede usar la :n,msintaxis de subcadena, de esta manera:

SET mypath=%~dp0
echo %mypath:~0,-1%

Desafortunadamente, no creo que haya una manera de combinar la %0sintaxis con la :~n,msintaxis.

Dean Harding
fuente
77
Excelente ... Lo he estado usando %~0\.., ¡sabía que tenía que haber una mejor manera! Además, es probable que desee para encerrar %~dp0entre comillas dobles ( "") en caso de que haya espacios en el nombre del directorio, etc.
Cameron
1
Agradable ! Pero, %~dp0contiene el `` al final. ¿Tienes una idea de cómo eliminarlo?
Misha Moroshko
1
@Misha: Supongo que te refieres a cómo eliminar la '\' al final. He actualizado mi respuesta con detalles.
Dean Harding
2
El ejemplo en la respuesta funciona bien sin comillas, incluso cuando hay un espacio en la ruta. (Por ejemplo, SET msg=hello worldfunciona bien). Sin embargo, cuando use% mypath% en otro lugar, debe tener cuidado de usarlo entre comillas, aunque tampoco son necesarios para cdninguno.
Martin Pain
2
Ese enlace ahora es 404
StingyJack
12

Puede usar el siguiente script para obtener la ruta sin seguir "\"

for %%i in ("%~dp0.") do SET "mypath=%%~fi"
duan
fuente
Sin embargo, esto no elimina el nombre de archivo de la ruta (por ejemplo, abc.txt en el ejemplo de OP).
dcp
44
@dcp Er, lo hace, sin embargo.
Kyle Strand
@Kyle Strand - Sí, lo intenté de nuevo y ahora funciona bien. No estoy seguro de lo que sucedió cuando lo probé originalmente, tal vez cometí un error en algún lugar del guión. Perdón por la confusión, y gracias por señalarlo.
dcp
11

%~dp0puede ser un camino relativo. Para convertirlo en una ruta completa, intente algo como esto:

pushd %~dp0
set script_dir=%CD%
popd
Arnaud
fuente
66
Ok, entonces ¿por qué no usarlo %~dp0directamente?
jpaugh
55
¿Una versión peor de la respuesta aceptada, publicada 5 años después? No entiendo.
Kyle Strand
Me imagino que esto se publicó para abordar el problema mencionado en los comentarios de la respuesta aceptada, %~dp0puede ser relativo, lo que puede ser o no un problema dependiendo del caso de uso
Michael Mrozek,
10
%~dp0no puede contener una ruta relativa, dsignifica unidad y pruta, ¿cómo una unidad puede ser relativa?
jeb
55
En que mundo Acabo de probar esta respuesta en Windows Server 2012 r2 y resulta que %~dp0será una ruta absoluta incluso cuando el script se ejecutó como una ruta relativa. Gracias al comentario de jeb, esta respuesta no me engañó. ¿Por qué la gente simplemente inventa cosas y comienza a difundir su imaginación salvaje a los demás? Tengo un colega que hace esto, pero culpé a su edad (joven). Deseo que mi voto negativo cuente.
bitooleano
0

Puede usar %~dp0, d significa solo la unidad, p significa solo la ruta, 0 es el argumento para el nombre de archivo completo del archivo por lotes.

Por ejemplo, si la ruta del archivo era C: \ Users \ Oliver \ Desktop \ example.bat, entonces el argumento sería igual a C: \ Users \ Oliver \ Desktop \, también puede usar el comando set cpath=%~dp0 && set cpath=%cpath:~0,-1%y usar la %cpath%variable para eliminar la barra diagonal final.

Hayz
fuente
1
No puedo ver más información, que en la respuesta de 9 años
jeb
La información adicional es "d significa solo la unidad, ...", etc. Gracias, @Hayz.
RJ Dunnill
-2

%cd% le dará la ruta del directorio desde donde se ejecuta el script.

Solo corre:

echo %cd%
Uddalak Biswas
fuente
%CD%es la carpeta de trabajo actual, no la carpeta, donde se almacena el archivo por lotes. Pueden ser el mismo lugar, pero a menudo no lo son.
Stephan
-7

Esa sería la %CD%variable.

@echo off
echo %CD%

%CD% devuelve el directorio actual en el que se encuentra el script por lotes.

Ruel
fuente
35
% cd% devuelve el directorio desde el que se ejecutó el script, no el directorio en el que se encuentra el script.
Misha Moroshko
44
solo funciona si su script no modifica el directorio de trabajo. Probar CD C:\Temp <CR> ECHO %CD%( <CR>es nueva línea ...)
Dean Harding
66
Además, si hace clic con el botón derecho en la secuencia de comandos y selecciona "Ejecutar como administrador", el directorio actual inicial es C: \ Windows \ System32 independientemente de dónde se encuentre la secuencia de comandos.
Cameron
Aunque no es una respuesta directa a la pregunta de OP, este sabor de la funcionalidad es exactamente lo que estaba buscando cuando encontré esta pregunta. ¡Gracias!
Zoltán
Ninguna de las otras soluciones publicadas parece funcionar para mí en Win7 32bit cmd.exe, al menos esto es útil para mí.
Clifford
-8

Estoy trabajando en una máquina con Windows 7 y terminé usando las líneas a continuación para obtener la ruta absoluta de la carpeta para mi script bash.

Llegué a esta solución después de mirar http://www.linuxjournal.com/content/bash-parameter-expansion .

#Get the full aboslute filename.
filename=$0
#Remove everything after \. An extra \ seems to be necessary to escape something...
folder="${filename%\\*}"
#Echo...
echo $filename
echo $folder
Jonas
fuente
2
El OP pregunta sobre los scripts de shell BAT / CMD de Windows, no bash.
rivy