¿Qué significa %~dp0 y cómo funciona?

Resuelto Sebastián Grignoli asked hace 13 años • 7 respuestas

Lo encuentro %~dp0muy ú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 dpunidad y camino? ¿Se 0refiere a %0la 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.

Sebastián Grignoli avatar Feb 18 '11 03:02 Sebastián Grignoli
Aceptado

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", dletra de unidad, pruta, y se pueden combinar. %~es el comienzo de cada una de esas secuencias y un número Iindica que funciona en el parámetro %I(donde %0está el nombre completo del archivo por lotes, tal como supuso).

schnaader avatar Feb 17 '2011 20:02 schnaader

(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 %~dp0variable (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-%9se refieren a los parámetros de la línea de comando del archivo por lotes. %1-%9consulte los argumentos de la línea de comando después del nombre del archivo por lotes. %0se 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. El dmodificador se expande a la letra de la unidad y el pmodificador se expande a la ruta del parámetro.

Ejemplo: digamos que tiene un directorio C:llamado bat_filesy en ese directorio hay un archivo llamado example.bat. En este caso, %~dp0 (combinando los modificadores dy p) se expandirá a C:\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-%9consulte los argumentos de la línea de comando. Si no son valores de ruta válidos, %~dp1- %~dp9todos 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\
smwikipedia avatar Apr 24 '2012 01:04 smwikipedia

La variable %0en un script por lotes se establece con el nombre del archivo por lotes en ejecución.

La ~dpsintaxis especial entre %y 0básicamente dice expandir la variable %0para mostrar la letra de la unidad y la ruta, lo que le brinda el directorio actual que contiene el archivo por lotes.

Ayuda = Enlace

Andy White avatar Feb 17 '2011 20:02 Andy White