2010-09-30 13 views
215

Sé que %0 contiene la ruta completa del script por lotes, p. c:\path\to\my\file\abc.bat¿Cómo obtener la ruta del script por lotes en Windows?

Me path a ser igual a c:\path\to\my\file

¿Cómo podría lograr eso?

+2

posible duplicado de [Línea de comando cmd/script .bat, cómo obtener el directorio del script en ejecución] (http://stackoverflow.com/questions/130112/command-line-cmd-bat-script-how-to-get-directory-of-running-script) –

+0

posible duplicado de [¿Cómo pasar los parámetros de la línea de comando a un archivo por lotes?] (http://stackoverflow.com/questions/26551/how-to-pass-command-line-parameters-to-a-batch-file) – cybermonkey

+0

Por cierto:% 0 no conta en la ruta completa si se llama al bate con una línea de comando relativa. Entonces, "% ~ dpf0" sería más confiable para este caso. – eckes

Respuesta

377

%~dp0 será el directorio. Here's some documentation on all of the path modifiers. materia de la diversión :-)

Para quitar la barra invertida final, se puede utilizar la sintaxis :n,m subcadena, así:

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

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

+6

Excelente ... He estado usando '% ~ 0 \ ..' - ¡sabía que tenía que haber una manera mejor! Además, es probable que desee adjuntar '% ~ dp0' entre comillas dobles (' "" ') en caso de que haya espacios en el nombre del directorio, etc. – Cameron

+1

¡Agradable! Pero, '% ~ dp0' contiene el' \ 'al final. ¿Tienes una idea de cómo eliminarlo? –

+0

@Misha: supongo que quieres decir cómo eliminar el '\' al final. He actualizado mi respuesta con detalles. –

-6

Eso sería la variable %CD%.

@echo off 
echo %CD% 

%CD% devuelve el directorio actual del archivo por lotes se encuentra.

+32

% cd% devuelve el directorio desde el que se ejecutó el script, no el directorio en el que se encuentra el script. –

+0

No, en realidad lo probé yo mismo: http://imgur.com/PzAMU.jpg – Ruel

+3

solo funciona si el script no lo hace modifique el directorio de trabajo. Pruebe 'CD C: \ Temp ECHO% CD%' ('' es nueva línea ...) –

-6

estoy trabajando en una máquina de Windows 7 y que han terminado usando las líneas de abajo para obtener la ruta de la carpeta absoluta para mi escritura del golpe.

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 
+0

El OP pregunta por los guiones de shell BAT/CMD de Windows, no por bash. – rivy

16

%~dp0 puede ser una ruta relativa. para convertirlo en una ruta completa, intentar algo como esto:

pushd %~dp0 
set script_dir=%CD% 
popd 
+4

Ok, ¿por qué no usar '% ~ dp0' directamente? – jpaugh

+2

¿Una versión peor de la respuesta aceptada, publicada 5 años después? No entiendo. –

+0

Imagino que esto se publicó para abordar el problema mencionado en los comentarios de la respuesta aceptada: '% ~ dp0' puede ser relativo, lo que puede o no ser un problema según el caso de uso –

5

Puede utilizar siguiente secuencia de comandos para obtener la ruta sin arrastre "\"

for %%i in ("%~dp0.") do SET "mypath=%%~fi" 
+0

Sin embargo, esto no elimina el nombre de archivo de la ruta (por ejemplo, abc.txt en el ejemplo de OP). – dcp

+3

@dcp Er, lo hace, sin embargo. –

+0

@Kyle Strand - Sí, lo intenté de nuevo y ahora está funcionando bien. No estoy seguro de qué pasó 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

Cuestiones relacionadas