1135 votos

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

Encuentro %~dp0 muy útil, y lo uso mucho para hacer que mis archivos por lotes sean más portátiles.

Pero el propio etiqueta me parece muy críptico... ¿Qué hace el ~? ¿Significa el dp unidad y ruta? ¿Se refiere el 0 a %0, la ruta al archivo por lotes que incluye el nombre del archivo?

¿O es solo una etiqueta extraña?

También me gustaría saber si es una característica documentada, o algo propenso a ser desaprobado.

13 votos

4 votos

Tienes razón, Hellen. Esa pregunta no apareció cuando busqué %~dp0. Tal vez porque tiene %~d0 en su título en lugar de %~dp0.

12 votos

SymbolHound es genial para realizar búsquedas en caracteres que no son alfanuméricos. Por ejemplo, busca %~dp0. Por lo general, me doy cuenta de que los resultados principales se refieren a contenido en SO.

881voto

schnaader Puntos 26212

Llamando

for /?

en la línea de comandos da ayuda sobre esta sintaxis (que también se puede utilizar fuera de FOR, este es solo el lugar donde se puede encontrar ayuda).

Además, la sustitución de referencias de variables FOR se ha mejorado. Ahora puedes usar la siguiente sintaxis opcional:

%~I         - expande %I eliminando cualquier comilla que lo rodee (")
%~fI        - expande %I a un nombre de ruta completamente calificado
%~dI        - expande %I a solo una letra de unidad
%~pI        - expande %I solo a una ruta
%~nI        - expande %I solo a un nombre de archivo
%~xI        - expande %I solo a una extensión de archivo
%~sI        - la ruta expandida contiene solo nombres cortos
%~aI        - expande %I a los atributos de archivo del archivo
%~tI        - expande %I a la fecha/hora del archivo
%~zI        - expande %I al tamaño del archivo
%~$PATH:I   - busca en los directorios listados en la variable de entorno PATH
               y expande %I al nombre completamente calificado del primero encontrado.
               Si el nombre de la variable de entorno no está
               definido o el archivo no se encuentra por la
               búsqueda, entonces este modificador expande a la
               cadena vacía

Los modificadores se pueden combinar para obtener resultados compuestos:

%~dpI       - expande %I a una letra de unidad y solo una ruta
%~nxI       - expande %I solo a un nombre de archivo y extensión
%~fsI       - expande %I a un nombre de ruta completo con solo nombres cortos
%~dp$PATH:I - busca en los directorios listados en la variable de entorno PATH
               para %I y expande a la letra de unidad y la ruta del primero encontrado.
%~ftzaI     - expande %I a una línea de salida similar a un DIR

En los ejemplos anteriores %I y PATH pueden ser substituidos por otros valores válidos. La sintaxis %~ se termina con un nombre de variable FOR válido. Elegir nombres de variable en mayúsculas como %I hacen que sea más legible y evitan confusiones con los modificadores, que no distinguen entre mayúsculas y minúsculas.

Existen diferentes letras que puedes usar como f para "nombre completo de ruta", d para letra de unidad, p para ruta, y se pueden combinar. %~ es el comienzo para cada una de esas secuencias y un número I lo denota funciona en el parámetro %I (donde %0 es el nombre completo del archivo por lotes, tal como supusiste).

2 votos

No sé sobre los demás, pero a mí me sale "El uso siguiente del operador de ruta en la sustitución de parámetros de lote es inválido. Para formatos válidos, escriba LLAME /? o DESDE /?. La sintaxis del comando es incorrecta." al usar I. Tengo que usar 0 en lugar de I. No sé si me he perdido algo o lo que sea, pero solo quería informar a la gente.

79 votos

@BenHooper, I es un marcador de posición para el índice de variable. 0 = el archivo que llama, 1 = argumento #1, 2 = argumento #2, etc...

10 votos

Esta respuesta es buena. Y exhaustiva. Para ser un poco más breve, me gusta la respuesta a esta pregunta casi duplicada: stackoverflow.com/questions/112055/…

407voto

smwikipedia Puntos 5491

(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 variable %~dp0 (ese es un cero) cuando se hace referencia dentro de un archivo por lotes de Windows se expandirá a la letra de unidad y camino de ese archivo por lotes.

Las variables %0-%9 se refieren a los parámetros de la línea de comandos del archivo por lotes. %1-%9 se refieren a los argumentos de la línea de comandos después del nombre del archivo por lotes. %0 se refiere al propio archivo por lotes.

Si sigues el carácter de porcentaje (%) con un carácter de tilde (~), puedes insertar un modificador(s) antes del número de parámetro para alterar la forma en que se expande la variable. El modificador d se expande a la letra de unidad y el modificador p se expande al camino del parámetro.

Ejemplo: Digamos que tienes un directorio en C: llamado bat_files, y en ese directorio hay un archivo llamado example.bat. En este caso, %~dp0 (combinando los modificadores d y p) se expandirá a C:\bat_files\.

Consulta este artículo de Microsoft para una explicación completa.

También, consulta este hilo del foro.

Y una referencia más clara de aquí:

  • %CmdCmdLine% devolverá toda la línea de comandos tal como se pasó a CMD.EXE

  • %* devolverá el resto de la línea de comandos a partir del primer argumento de la línea de comandos (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 un nombre de camino o archivo válido (sin UNC)

  • %~pn devolverá el directorio de %n si %n es un nombre de camino o archivo válido (sin UNC)

  • %~nn devolverá solo el nombre de archivo de %n si %n es un nombre de archivo válido

  • %~xn devolverá solo la extensión de archivo de %n si %n es un nombre de archivo válido

  • %~fn devolverá el camino completamente cualificado de %n si %n es un nombre de archivo o directorio válido

AGREGAR 1

Acabo de encontrar una buena referencia para el misterioso operador de tilde ~.

La secuencia %~ se llama operador de tilde porcentaje tilde. Puedes encontrarlo en situaciones como: %~0.

La secuencia :~ se llama operador de tilde de dos puntos dos puntos tilde. Puedes encontrarlo como %SOME_VAR:~0,-1%.

AGREGAR 2 - 1:12 PM 7/6/2018

%1-%9 se refieren a los argumentos de la línea de comandos. Si no son valores de camino válidos, %~dp1 - %~dp9 se expandirán todos al mismo valor que %~dp0. Pero si son valores de camino válidos, se expandirán a su propio valor de unidad/camino.

Por ejemplo: (batch.bat)

@echo off
@echo ~dp0= %~dp0
@echo ~dp1= %~dp1
@echo ~dp2= %~dp2
@echo on

Ejecución 1:

D:\Workbench>batch arg1 arg2

~dp0= D:\Workbench\
~dp1= D:\Workbench\
~dp2= D:\Workbench\

Ejecución 2:

D:\Workbench>batch c:\123\a.exe e:\abc\b.exe

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\

0 votos

También me interesa este concepto y encontré la buena aclaración aquí. Gracias Mingge. ^_^

1 votos

Para mí se expande a c:\bat_files\ (con separador de ruta final)

0 votos

Los enlaces al artículo de Microsoft y al hilo del foro ya no funcionan :(

165voto

Andy White Puntos 36586

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

La sintaxis especial ~dp entre el % y el 0 básicamente indica que se expanda la variable %0 para mostrar la letra de la unidad y la ruta, ¡lo que te brinda el directorio actual que contiene el archivo por lotes!

Ayuda = Link

0 votos

@Andy, ¿existe alguna forma de probar %0 directamente en el cmd sin guardar un archivo .bat en el disco duro local?

0 votos

El enlace está roto y no puedo encontrar el enlace correcto. Todavía hay una edición pendiente que contiene el enlace roto.

42voto

Marvin Thobejane Puntos 356

Otro consejo que sería de mucha ayuda es que para establecer el directorio actual en una unidad diferente se debe usar primero %~d0, luego cd %~dp0. Esto cambiará el directorio a la unidad del archivo por lotes y luego cambiará a su carpeta.

Alternativamente, para los amantes de las #oneLiner, como señaló @Omni en los comentarios cd /d %~dp0 cambiará tanto la unidad como el directorio :)

Espero que esto ayude a alguien.

23 votos

El comando cd tiene un parámetro incorporado que cambiará tanto la unidad como la carpeta: cd /d %~dp0

2 votos

Tienes razón y el argumento /d es útil, pero merece ser publicado como una respuesta alternativa candidata y no como un comentario a esta. Gracias por señalar esto, aunque no lo sabía :)

5 votos

También podrías usar ''pushd %~dp0'' para cambiar de unidad y carpeta

26voto

HansBKK Puntos 326

Gran ejemplo del lanzador de shell portable de Strawberry Perl:

set drive=%~dp0
set drivep=%drive%
if #%drive:~-1%# == #\# set drivep=%drive:~0,-1%

set PATH=%drivep%\perl\site\bin;%drivep%\perl\bin;%drivep%\c\bin;%PATH%

No estoy seguro de qué hace el -1 negativo allí, ¡pero funciona de maravilla!

11 votos

+1 muy útil. La declaración if verifica si hay una barra invertida presente y elimina la barra invertida si es necesario. El -1 negativo en la condición extrae el último carácter, y la expresión en la declaración set toma la cadena de la ruta menos el último carácter (que es la barra invertida).

1 votos

1 negativo es menos el último caracter. Lea subcadena de variable

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X