¿Qué significa% ~ d0 en un archivo por lotes de Windows?

355

Estoy mirando un archivo por lotes que define las siguientes variables:

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • ¿Qué significa %~d0o %~p0realmente significa?
  • ¿Existe un conjunto de valores bien conocidos para cosas como el directorio actual, la unidad, los parámetros de un script?
  • ¿Hay otros atajos similares que pueda usar?
Chris Smith
fuente

Respuestas:

541

Las variables mágicas %n contienen los argumentos utilizados para invocar el archivo: %0es la ruta al archivo bat en sí, %1es el primer argumento después, %2es el segundo y así sucesivamente.

Dado que los argumentos son a menudo rutas de archivos, existe una sintaxis adicional para extraer partes de la ruta. ~des la unidad, ~pes la ruta (sin unidad), ~nes el nombre del archivo. Se pueden combinar, por lo que ~dpes drive + ruta.

%~dp0 Por lo tanto, es bastante útil en un murciélago: es la carpeta en la que reside el archivo de ejecución del murciélago.

También puede obtener otros tipos de metainformación sobre el archivo: ~tes la marca de tiempo, ~zes el tamaño.

Busque aquí una referencia para todos los comandos de línea de comandos. Los códigos de tilde-magic se describen a continuación para .

JacquesB
fuente
15
Nota personal: echo %~dp0no funcionará en la línea de comandos, solo en un archivo por lotes. Duh!
northben
2
¿Hay alguna diferencia entre %~d0y %~d0%?
Geoffrey
2
@Pacerier:% 0 es la ruta completa que incluye el nombre de archivo del script. % ~ dp0 es la ruta a la carpeta que contiene el script pero excluye el nombre del archivo del script.
JacquesB
44
note to self: echo %~pd0da la misma salida que echo %~dp0(en lugar de inversa como se esperaba). Además, el valor de %0es diferente dependiendo de si hace doble clic en el archivo por lotes o lo ejecuta desde cmd.
Pacerier
152

Son sustituciones variables mejoradas. Modifican las variables% N utilizadas en los archivos por lotes. Muy útil si te gusta la programación por lotes en Windows.

%~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

Puede encontrar lo anterior ejecutando FOR /?.

efotinis
fuente
48

Sí, hay otros métodos abreviados que puede utilizar que se detallan a continuación. En su comando, ~ d0 significaría la letra de unidad del argumento 0.

~ expands the given variable
d gets the drive letter only
0 is the argument you are referencing

Como el argumento 0 es la ruta del script, obtiene la letra de la ruta para usted. También puedes usar los siguientes atajos.

%~1         - expands %1 removing any surrounding quotes (")
%~f1        - expands %1 to a fully qualified path name
%~d1        - expands %1 to a drive letter only
%~p1        - expands %1 to a path only
%~n1        - expands %1 to a file name only
%~x1        - expands %1 to a file extension only
%~s1        - expanded path contains short names only
%~a1        - expands %1 to file attributes
%~t1        - expands %1 to date/time of file
%~z1        - expands %1 to size of file
%~$PATH:1   - searches the directories listed in the PATH
               environment variable and expands %1 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    

%~dp1       - expands %1 to a drive letter and path only
%~nx1       - expands %1 to a file name and extension only
%~dp$PATH:1 - searches the directories listed in the PATH
               environment variable for %1 and expands to the
               drive letter and path of the first one found.
%~ftza1     - expands %1 to a DIR like output line

Esto también se puede encontrar directamente en el símbolo del sistema cuando ejecuta CALL /? o por /?

Clewaks
fuente
9

Otro consejo que sería una gran ayuda es que para establecer el directorio actual a una unidad diferente habría que utilizar %~d0en primer lugar, a continuación cd %~dp0. Esto cambiará el directorio a la unidad del archivo por lotes, luego cambiará a su carpeta.

Para #oneLinerLovers, cd /d %~dp0cambiará tanto la unidad como el directorio :)

Espero que esto ayude a alguien.

Marvin Thobejane
fuente
77
Otra opción es pushd %~dp0, que no tiene problemas para cambiar la unidad actual, y le da la ventaja adicional de poder popdvolver a la unidad / ruta original más adelante.
bcrist
7

%~d0le da la letra de unidad del argumento 0 (el nombre del script), %~p0la ruta.

Armin Ronacher
fuente
6

Algunas trampas a tener en cuenta:

Si hace doble clic en el archivo por lotes %0, estará entre comillas. Por ejemplo, si guarda este archivo como c:\test.bat:

@echo %0
@pause

Al hacer doble clic se abrirá un nuevo símbolo del sistema con salida:

"C:\test.bat"

Pero si primero abre un símbolo del sistema y lo llama directamente desde ese símbolo del sistema, %0se referirá a lo que haya escrito . Si escribe test.batEnter, la salida de %0no tendrá comillas porque no escribió comillas:

c:\>test.bat
test.bat

Si escribe testEnter, la salida de %0no tendrá extensión, porque no escribió extensión:

c:\>test
test

Lo mismo para tEsTEnter:

c:\>tEsT
tEsT

Si escribe "test"Enter, la salida de %0tendrá comillas (ya que las escribió) pero sin extensión:

c:\>"test"
"test"

Por último, si escribe "C:\test.bat", el resultado sería exactamente como si hubiera hecho doble clic en él:

c:\>"C:\test.bat"
"C:\test.bat"

Tenga en cuenta que estos no son todos los valores posibles %0porque puede llamar al script desde otras carpetas:

c:\some_folder>/../teST.bAt
/../teST.bAt

Todos los ejemplos mostrados arriba también afectarán %~0, porque la salida de %~0es simplemente la salida de %0 comillas negativas (si las hay).

Pacerier
fuente
3

Este código explica el uso del carácter ~ tilda, que fue lo más confuso para mí. Una vez que entendí esto, hace las cosas mucho más fáciles de entender:

@ECHO off
SET "PATH=%~dp0;%PATH%"
ECHO %PATH%
ECHO.
CALL :testargs "these are days" "when the brave endure"
GOTO :pauseit
:testargs
SET ARGS=%~1;%~2;%1;%2
ECHO %ARGS%
ECHO.
exit /B 0
:pauseit
pause
djangofan
fuente
1

Muestra la ubicación actual del archivo o directorio en el que se encuentra actualmente. Por ejemplo; si su archivo por lotes estaba en el directorio del escritorio, entonces "% ~ dp0" mostraría el directorio del escritorio. si desea que muestre el directorio actual con el nombre del archivo actual, puede escribir "% ~ dp0% ~ n0% ~ x0".

zask
fuente
"% ~ dpnx0" sería mejor
FrinkTheBrave