batch-file - off - lenguaje batch
Script de línea de comandos.cmd/.bat, cómo obtener el directorio del script en ejecución (3)
¿Cómo se puede obtener el directorio del script que se ejecutó y usarlo dentro del archivo .cmd?
Esto es equivalente a la ruta de la secuencia de comandos:
%~dp0
Utiliza la sintaxis de la extensión de parámetros por lotes. El parámetro 0 es siempre el script en sí mismo.
Si su script se almacena en C:/example/script.bat
, entonces %~dp0
evalúa como C:/example/
.
ss64.com tiene más información sobre la sintaxis de extensión de parámetros. Aquí está el extracto relevante:
Puede obtener el valor de cualquier parámetro usando un% seguido de su posición numérica en la línea de comando.
[...]
Cuando se usa un parámetro para proporcionar un nombre de archivo, se puede aplicar la siguiente sintaxis extendida:
[...]
% ~ d1 Expandir% 1 a letra de unidad solamente - C:
[...]
% ~ p1 Expandir% 1 a una ruta solamente, por ej. / utils / esto incluye un rastreo / que algunos comandos pueden interpretar como un carácter de escape.
[...]
Los modificadores anteriores se pueden combinar:
% ~ dp1 Expandir% 1 a una letra de unidad y ruta solamente
[...]
Puede obtener la ruta de acceso del script por lotes con% 0, las extensiones de parámetros se pueden aplicar a esto, por lo que% ~ dp0 devolverá la unidad y la ruta a la secuencia de comandos por lotes, por ejemplo, W: / scripts /
Raymond Chen tiene algunas ideas:
http://blogs.msdn.com/oldnewthing/archive/2005/01/28/362565.aspx
Citado aquí en su totalidad porque los archivos de MSDN tienden a ser poco confiables:
La manera más fácil es usar
%CD%
pseudovariable%CD%
. Se expande al directorio de trabajo actual.
set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory
(Por supuesto, el directorio de guardar / restaurar podría haberse hecho más fácilmente con
pushd
/popd
, pero ese no es el punto aquí).El truco
%CD%
es útil incluso desde la línea de comando. Por ejemplo, a menudo me encuentro en un directorio donde hay un archivo en el que quiero operar, pero ... oh, necesito chdir a otro directorio para realizar esa operación.
set _=%CD%/curfile.txt
cd ... some other directory ...
somecommand args %_% args
(Me gusta usar
%_%
como mi variable de entorno de scratch).Tipo
SET /?
para ver las otras pseudovariables proporcionadas por el procesador de comandos.
También vale la pena explorar los comentarios del artículo, por ejemplo, este:
http://blogs.msdn.com/oldnewthing/archive/2005/01/28/362565.aspx#362741
Esto cubre el uso de% ~ dp0:
Si desea saber dónde vive el archivo por lotes:
%~dp0
%0
es el nombre del archivo por lotes.~dp
le proporciona la unidad y la ruta del argumento especificado.
for /F "eol= delims=~" %%d in (''CD'') do set curdir=%%d
pushd %curdir%