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

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

set _SCRIPT_DRIVE=%~d0 set _SCRIPT_PATH=%~p0 
  • ¿Qué significan %~d0 o %~p0 realidad?
  • ¿Existe un conjunto de valores conocidos para cosas como el directorio actual, la unidad, los parámetros de un script?
  • ¿Hay algún otro atajo similar que pueda usar?

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

Dado que los argumentos son a menudo rutas de archivos, hay alguna syntax adicional para extraer partes de la ruta. ~d es unidad, ~p es la ruta (sin unidad), ~n es el nombre del archivo. Se pueden combinar así que ~dp es drive + path.

%~dp0 es, por lo tanto, bastante útil en un murciélago: es la carpeta en la que reside el archivo bat ejecutado.

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

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

Son sustituciones variables mejoradas. Modifican las variables% N utilizadas en los archivos por lotes. Muy útil si te gusta la progtwigció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 /? .

Sí, hay otros accesos directos que puede usar que se detallan a continuación. En su comando, ~ d0 significaría la letra de la unidad del 0º argumento.

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

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

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

Desde el análisis de nombre de archivo en archivo de proceso por lotes y más expresiones idiomáticas – Real’s How-to :

La ruta (sin unidad) donde está la secuencia de comandos: ~ p0

El disco donde está el script: ~ d0

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

Para #oneLinerLovers, cd /d %~dp0 cambiará la unidad y el directorio 🙂

Espero que esto ayude a alguien.

%~d0 le proporciona la letra de la unidad del argumento 0 (el nombre del script), %~p0 la ruta.

Algunas trampas para tener cuidado:

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

 @echo %0 @pause 

Al hacer doble clic en él, 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 el símbolo del sistema, %0 hará referencia a lo que haya escrito . Si escribe test.bat Enter , la salida de %0 no tendrá citas porque no ingresó comillas:

 c:\>test.bat test.bat 

Si escribe la test Enter , la salida de %0 tampoco tendrá extensión, porque no escribió ninguna extensión:

 c:\>test test 

Lo mismo para tEsT Ingrese :

 c:\>tEsT tEsT 

Si escribe "test" Enter , la salida de %0 tendrá 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 lo hubiera hecho doble clic:

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

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

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

Todos los ejemplos mostrados anteriormente también afectarán a %~0 , porque la salida de %~0 es simplemente el resultado de %0 menos comillas (si corresponde).

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 

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”.