tagger tag windows batch-file cmd

tag - ¿Puede un archivo por lotes de Windows determinar su propio nombre de archivo?



tag folders (7)

¿Puede un archivo por lotes de Windows determinar su propio nombre de archivo?

Por ejemplo, si ejecuto el archivo por lotes C: / Temp / myScript.bat, ¿hay un comando dentro de myScript.bat que pueda determinar la cadena "myScript.bat"?


A continuación está mi código inicial:

@echo off Set z=%% echo. echo %z%0.......%0 echo %z%~0......%~0 echo %z%n0......%n0 echo %z%x0......%x0 echo %z%~n0.....%~n0 echo %z%dp0.....%dp0 echo %z%~dp0....%~dp0 echo.

Me di cuenta de que el nombre de archivo dado por% ~ 0 y% 0 es la forma en que se ingresó en el comando-shell y no cómo se nombra realmente ese archivo. Entonces, si quiere el caso literal utilizado para el nombre del archivo, debe usar% ~ n0. Sin embargo, esto dejará fuera la extensión del archivo. Pero si conoce el nombre del archivo, puede agregar el siguiente código.

set b=%~0 echo %~n0%b:~8,4%

He aprendido que ": ~ 8,4%" significa comenzar en el noveno carácter de la variable y luego mostrar mostrar los siguientes 4 caracteres. El rango es 0 hasta el final de la cadena variable. ¡Entonces% Path Path sería muy largo!

fIlEnAmE.bat 012345678901

Sin embargo, esto no es tan bueno como la solución de Jool (% ~ x0) anterior.

Mi Evidencia:

C:/bin>filename.bat %0.......filename.bat %~0......filename.bat . . . C:/bin>fIlEnAmE.bat %0.......fIlEnAmE.bat %~0......fIlEnAmE.bat %n0......n0 %x0......x0 %~n0.....FileName %dp0.....dp0 %~dp0....C:/bin/ %~n0%b:~8,4%...FileName.bat Press any key to continue . . . C:/bin>dir Volume in drive C has no label. Volume Serial Number is CE18-5BD0 Directory of C:/bin . . . 05/02/2018 11:22 PM 208 FileName.bat

Aquí está el código final

@echo off Set z=%% set b=%~0 echo. echo %z%0.......%0 echo %z%~0......%~0 echo %z%n0......%n0 echo %z%x0......%x0 echo %z%~n0.....%~n0 echo %z%dp0.....%dp0 echo %z%~dp0....%~dp0 echo. echo A complex solution: echo =================================== echo %z%~n0%z%b:~8,4%z%...%~n0%b:~8,4% echo =================================== echo. echo The preferred solution: echo =================================== echo %z%~n0%z%~x0.......%~n0%~x0 echo =================================== pause


Intenta correr debajo del ejemplo para sentir cómo funcionan las variables mágicas.

@echo off SETLOCAL EnableDelayedExpansion echo Full path and filename: %~f0 echo Drive: %~d0 echo Path: %~p0 echo Drive and path: %~dp0 echo Filename without extension: %~n0 echo Filename with extension: %~nx0 echo Extension: %~x0 echo date time : %~t0 echo file size: %~z0 ENDLOCAL

Las reglas relacionadas son las siguientes.

%~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 obtener el nombre del archivo, pero también puede obtener la ruta completa, dependiendo de lo que coloque entre ''% ~'' y ''0''. Elija entre

d -- drive p -- path n -- file name x -- extension f -- full path

Por ejemplo, desde adentro de c: / tmp / foo.bat, %~nx0 te da "foo.bat", mientras que %~dpnx0 da "c: / tmp / foo.bat". Tenga en cuenta que las piezas siempre se ensamblan en orden canónico, por lo que si se pone lindo y prueba %~xnpd0 , todavía obtiene "c: / tmp / foo.bat"


Sí.

Use la variable especial %0 para obtener la ruta al archivo actual.

Escribe %~n0 para obtener solo el nombre del archivo sin la extensión.

Escribe %~n0%~x0 para obtener el nombre de archivo y la extensión.

También es posible escribir %~nx0 para obtener el nombre de archivo y la extensión.


Tenga en cuenta que 0 es un caso especial de números de parámetros dentro de un archivo por lotes, donde 0 significa que este archivo se da en la línea de comando .

Entonces, si el archivo es miarchivo.bat, puede llamarlo de varias maneras, cada una de las cuales le daría un resultado diferente del uso de% 0 o% ~ 0:

mi archivo

myfile.bat

mydir / myfile.bat

c: / mydir / myfile.bat

"c: / mydir / myfile.bat"

Todo lo anterior son llamadas legales si lo llamas desde el lugar relativo correcto al directorio en el que existe. % ~ 0 elimina las comillas del último ejemplo, mientras que% 0 no.

Debido a que todos estos dan resultados diferentes, es muy poco probable que% 0 y% ~ 0 sean realmente los que desea usar.

Aquí hay un archivo por lotes para ilustrar:

@echo Full path and filename: %~f0 @echo Drive: %~d0 @echo Path: %~p0 @echo Drive and path: %~dp0 @echo Filename without extension: %~n0 @echo Filename with extension: %~nx0 @echo Extension: %~x0 @echo Filename as given on command line: %0 @echo Filename as given on command line minus quotes: %~0 @REM Build from parts @SETLOCAL @SET drv=%~d0 @SET pth=%~p0 @SET fpath=%~dp0 @SET fname=%~n0 @SET ext=%~x0 @echo Simply Constructed name: %fpath%%fname%%ext% @echo Fully Constructed name: %drv%%pth%%fname%%ext% @ENDLOCAL pause


Usando la siguiente secuencia de comandos, basada en la respuesta de SLaks, determiné que la respuesta correcta es:

echo The name of this file is: %~n0%~x0 echo The name of this file is: %~nx0

Y aquí está mi script de prueba:

@echo off echo %0 echo %~0 echo %n0 echo %x0 echo %~n0 echo %dp0 echo %~dp0 pause

Lo que me parece interesante es que % nx0 no funcionará, dado que sabemos que el carácter "~" generalmente se usa para quitar / recortar las cotizaciones de una variable.


%0 es lo que estás buscando. Vea esta pregunta para más.

echo %0