¿Qué significa %~dp0 y cómo funciona?
Lo encuentro %~dp0
muy útil y lo uso mucho para hacer que mis archivos por lotes sean más portátiles.
Pero la etiqueta en sí me parece muy críptica... ¿Qué está ~
haciendo? ¿Significa dp
unidad y camino? ¿Se 0
refiere a %0
la ruta al archivo por lotes que incluye el nombre del archivo?
¿O es simplemente una etiqueta extraña?
También me gustaría saber si es una característica documentada o algo que tiende a quedar obsoleto.
Vocación
for /?
en la línea de comandos brinda ayuda sobre esta sintaxis (que también se puede usar fuera de FOR, este es solo el lugar donde se puede encontrar ayuda).
Además, se ha mejorado la sustitución de referencias variables FOR. Ahora puede utilizar la siguiente sintaxis opcional:
%~I - expands %I removing any surrounding quotes (") %~fI - expands %I to a fully qualified path name %~dI - expands %I to a drive letter only %~pI - expands %I to a path only %~nI - expands %I to a file name only %~xI - expands %I to a file extension only %~sI - expanded path contains short names only %~aI - expands %I to file attributes of file %~tI - expands %I to date/time of file %~zI - expands %I to size of file %~$PATH:I - searches the directories listed in the PATH environment variable and expands %I to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string
Los modificadores se pueden combinar para obtener resultados compuestos:
%~dpI - expands %I to a drive letter and path only %~nxI - expands %I to a file name and extension only %~fsI - expands %I to a full path name with short names only %~dp$PATH:I - searches the directories listed in the PATH environment variable for %I and expands to the drive letter and path of the first one found. %~ftzaI - expands %I to a DIR like output line
En los ejemplos anteriores, %I y PATH se pueden reemplazar por otros valores válidos. La sintaxis %~ termina con un nombre de variable FOR válido. Elegir nombres de variables en mayúsculas como %I lo hace más legible y evita confusión con los modificadores, que no distinguen entre mayúsculas y minúsculas.
Hay diferentes letras que puede usar, como f
"nombre de ruta completo", d
letra de unidad, p
ruta, y se pueden combinar. %~
es el comienzo de cada una de esas secuencias y un número I
indica que funciona en el parámetro %I
(donde %0
está el nombre completo del archivo por lotes, tal como supuso).
(Primero, me gustaría recomendar este útil sitio de referencia para lotes: http://ss64.com/nt/ )
Luego, otra explicación útil: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/
La variable %~dp0
La
%~dp0
variable (que es un cero) cuando se hace referencia dentro de un archivo por lotes de Windows se expandirá a la letra de unidad y la ruta de ese archivo por lotes.Las variables
%0-%9
se refieren a los parámetros de la línea de comando del archivo por lotes.%1-%9
consulte los argumentos de la línea de comando después del nombre del archivo por lotes.%0
se refiere al archivo por lotes en sí.Si sigue el carácter de porcentaje (
%
) con un carácter de tilde (~
), puede insertar modificadores antes del número de parámetro para alterar la forma en que se expande la variable. Eld
modificador se expande a la letra de la unidad y elp
modificador se expande a la ruta del parámetro.Ejemplo: digamos que tiene un directorio
C:
llamadobat_files
y en ese directorio hay un archivo llamadoexample.bat
. En este caso,%~dp0
(combinando los modificadoresd
yp
) se expandirá aC:\bat_files\
.Consulte este artículo de Microsoft para obtener una explicación completa.
Además, consulte este hilo del foro .
Y una referencia más clara de aquí :
%CmdCmdLine%
devolverá la línea de comando completa tal como se pasó a CMD.EXE%*
devolverá el resto de la línea de comando comenzando en el primer argumento de la línea de comando (en Windows NT 4, %* también incluye todos los espacios iniciales)%~dn
devolverá la letra de unidad de %n (n puede variar de 0 a 9) si %n es una ruta válida o un nombre de archivo (sin UNC)%~pn
devolverá el directorio de %n si %n es una ruta o nombre de archivo válido (sin UNC)%~nn
devolverá el nombre de archivo solo de %n si %n es un nombre de archivo válido%~xn
devolverá la extensión de archivo solo de %n si %n es un nombre de archivo válido%~fn
devolverá la ruta completa de %n si %n es un nombre de archivo o directorio válido
AÑADIR 1
Acabo de encontrar una buena referencia para el misterioso ~
operador de tilde.
La %~
cadena se llama operador de tilde porcentual . Puedes encontrarlo en situaciones como: %~0
.
La :~
cadena se llama operador de dos puntos y tilde . Puedes encontrarlo como %SOME_VAR:~0,-1%
.
AÑADIR 2 - 13:12 6/7/2018
%1-%9
consulte los argumentos de la línea de comando. Si no son valores de ruta válidos, %~dp1
- %~dp9
todos se expandirán al mismo valor que %~dp0
. Pero si son valores de ruta válidos, se expandirán a su propio valor de ruta/controlador.
Por ejemplo: (lote.bat)
@echo off
@echo ~dp0= %~dp0
@echo ~dp1= %~dp1
@echo ~dp2= %~dp2
@echo on
Ejecutar 1:
D:\Workbench>batch arg1 arg2
~dp0= D:\Workbench\
~dp1= D:\Workbench\
~dp2= D:\Workbench\
Ejecutar 2:
D:\Workbench>batch c:\123\a.exe e:\abc\b.exe
~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\
La variable %0
en un script por lotes se establece con el nombre del archivo por lotes en ejecución.
La ~dp
sintaxis especial entre %
y 0
básicamente dice expandir la variable %0
para mostrar la letra de la unidad y la ruta, lo que le brinda el directorio actual que contiene el archivo por lotes.
Ayuda = Enlace