Pregunta ¿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 la etiqueta en sí me parece muy críptica ... ¿cuál es la ~ ¿obra? hace dp unidad media y camino? hace el 0 Referirse 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.


810
2018-02-17 20:15


origen


Respuestas:


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 el lugar donde se puede encontrar ayuda).

Además, la sustitución de FOR   las referencias variables se han mejorado.   Ahora puede usar la siguiente opción   sintaxis:

%~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 pueden   ser reemplazado por otros valores válidos.   La sintaxis% ~ es terminada por un válido   PARA nombre de variable. Picking mayúsculas   nombres variables como% I lo hacen más   legible y evita la confusión con el   modificadores, que no son el caso   sensible.

Hay diferentes letras que puedes usar como f para "nombre de ruta completo", d para la letra de la unidad, p para el camino, y se pueden combinar. %~ es el comienzo de cada una de esas secuencias y un número I denota que funciona en el parámetro %I (dónde %0 es el nombre completo del archivo de proceso por lotes, tal como suponía).


648
2018-02-17 20:19



(Primero, me gustaría recomendar este útil sitio de referencia para lotes: http://ss64.com/nt/)

Entonces solo otra explicación útil: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/

La variable% ~ dp0

La variable% ~ dp0 (eso es cero) cuando se hace referencia dentro de un Windows   el archivo por lotes se expandirá al rerive carta y pagath de ese lote   archivo.

Las variables% 0-% 9 se refieren a los parámetros de línea de comando del lote   archivo. % 1-% 9 hace referencia a los argumentos de la línea de comando después del nombre del archivo por lotes.   % 0 hace referencia al archivo por lotes en sí.

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

Ejemplo: Supongamos que tiene 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.

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

Además, echa un vistazo este hilo del foro.

Y una referencia más clara de aquí:

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

  • %*  devolverá el resto de la línea de comando comenzando en el primer argumento de línea de comando (en Windows NT 4,% * también incluye todos los espacios iniciales)

  • %~dndevolverá la letra de la unidad de% n (n puede ir de 0 a 9) si% n es una ruta válida o nombre de archivo (no UNC)

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

  • %~nn    devolverá el nombre de archivo solamente 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 totalmente calificada de% n si% n es un nombre de archivo o directorio válido

ADD 1

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

los %~ cadena se llama porcentaje de tilde operador. Puedes encontrarlo en situaciones como las siguientes: %~0.

los :~ cadena se llama tilde de colon operador. Puedes encontrarlo como %SOME_VAR:~0,-1%.

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

%1-%9 refiérase a la línea de comando args. Si ellos estan no valores de ruta válidos, %~dp1 - %~dp9 todos se expandirán al mismo valor que %~dp0. Pero si ellos son valores de ruta válidos, se expandirán a su propio valor del controlador / ruta.

Por ejemplo: (batch.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\

243
2018-04-24 01:51



http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true

La variable %0 en un script por lotes se establece en el nombre del archivo por lotes en ejecución. los ~dp sintaxis especial entre el % y el 0 básicamente dice expandir la variable %0 para mostrar la letra de la unidad y la ruta, ¡que le proporciona el directorio actual que contiene el archivo por lotes!


137
2018-02-17 20:28



Otro consejo que ayudaría mucho es establecer el directorio actual a unidad diferente uno tendría que usar %~d0 primero luego cd %~dp0. Esto cambiará el directorio a la unidad del archivo por lotes, luego cambiará a su carpeta.

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

Espero que esto ayude a alguien.


30
2017-09-14 08:54



% ~ dp0 se expande a la ruta del directorio actual del archivo por lotes en ejecución.

Para obtener una comprensión clara, creemos un archivo por lotes en un directorio.

C: \ script \ test.bat

con contenido:

@echo off
echo %~dp0

Cuando lo ejecuta desde el símbolo del sistema, verá este resultado:

C: \ script \


30
2017-11-25 08:44



Gran ejemplo del lanzador de shell portátil 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 lo que el 1 negativo está haciendo allí, ¡pero funciona de maravilla!


20
2017-09-25 18:39



Un ejemplo sería bueno, aquí hay uno trivial

for %I in (*.*) do @echo %~xI

enumera solo las EXTENSIONES de cada archivo en la carpeta actual

para combinaciones de variables más útiles (también enumeradas en respuesta anterior) desde el prompt de ejecución de CMD: HELP FOR que contiene este fragmento

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

10
2018-06-21 16:31