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