batch-file - simple - run bat file from cmd
¿Qué significa% ~ dp0 y cómo funciona? (7)
Encuentro que %~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
significa unidad y camino? ¿Se refiere el 0
a %0
, la ruta al archivo por lotes que incluye el nombre del archivo?
¿O es sólo una etiqueta extraña?
También me gustaría saber si es una característica documentada, o algo propenso a ser desaprobado.
% ~ dp0 se expande a la ruta del directorio actual del archivo por lotes en ejecución.
Para obtener una comprensión clara, vamos a crear un archivo por lotes en un directorio.
C: / script / test.bat
con contenidos:
@echo off
echo %~dp0
Cuando lo ejecute desde el símbolo del sistema, verá este resultado:
C: / script /
(Primero, me gustaría recomendar este sitio de referencia útil para el lote: 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 (que es un cero) cuando se hace referencia dentro de un archivo por lotes de Windows se expandirá a la letra de acceso y la página 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 se refieren a 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 un modificador (es) antes del número de parámetro para modificar la forma en que se expande la variable. El modificador d se expande a la letra de la unidad y el modificador p se expande a la ruta del parámetro.
Ejemplo: Digamos 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.
Echa un vistazo a este artículo de Microsoft para una explicación completa.
También, echa un vistazo a este hilo del foro .
Y una referencia más clara desde here :
%CmdCmdLine%
devolverá la línea de comando completa 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 una ruta válida o un nombre de archivo (sin 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 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 de acceso completa 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 cadena %~
se llama porcentaje de operador de tilde . Lo puedes encontrar en situaciones como: %~0
.
La cadena :~
se llama operador de tilde de dos puntos . Lo puedes encontrar como %SOME_VAR:~0,-1%
.
AGREGAR 2 - 1:12 PM 7/6/2018
%1-%9
refieren a la línea de comando args. Si no son valores de ruta válidos, %~dp1
- %~dp9
se expandirán al mismo valor que %~dp0
. Pero si son valores de ruta válidos, se expandirán a su propio valor de 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/
Gran ejemplo del lanzador de cáscara 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!
Otra sugerencia que ayudaría mucho es que para configurar el directorio actual en una unidad diferente, primero habría que usar %~d0
, 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.
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 obtener combinaciones de variables más útiles (también enumeradas en la respuesta anterior) desde la solicitud de CMD ejecute: HELP FOR
que contiene este fragmento de código
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
Vocación
for /?
en la línea de comandos proporciona ayuda sobre esta sintaxis (que también se puede usar fuera de FOR, este es el lugar donde se puede encontrar ayuda).
Además, se ha mejorado la sustitución de las referencias de variable 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% ~ se termina con un nombre de variable FOR válido. Seleccionar nombres de variables en mayúsculas como% I lo hace más legible y evita la confusión con los modificadores, que no distinguen entre mayúsculas y minúsculas.
Hay diferentes letras que puede usar como f
para "nombre de ruta completa", d
para letra de unidad, p
para 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
es el nombre completo del archivo de proceso por lotes, como suponía).
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. La sintaxis especial de ~dp
entre %
y 0
básicamente dice que se amplíe la variable %0
para mostrar la letra y la ruta de la unidad, ¡lo que le da el directorio actual que contiene el archivo por lotes!