¿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"?
windows
batch-file
cmd
djangofan
fuente
fuente
%0
es lo que estas buscando. Consulte [esta pregunta] [1] para obtener más información. [1]: stackoverflow.com/questions/357315/…Respuestas:
Si.
Utilice la
%0
variable especial para obtener la ruta al archivo actual.Escriba
%~n0
para obtener solo el nombre del archivo sin la extensión.Escriba
%~n0%~x0
para obtener el nombre del archivo y la extensión.También es posible escribir
%~nx0
para obtener el nombre y la extensión del archivo.fuente
cd
ingresa primero al directorio y ejecuta el lote desde allí,% 0 generalmente no tendrá la información de ruta (pero podría obtenerla de% cd% en ese caso)%cd%
devolverá el directorio actual del proceso que llamó al archivo por lotes. Por lo tanto, si se encuentra en un indicadorD:\dir1
y entraY:\foo\bar.bat
, si lobar.bat
tiene@echo %cd%
, se mostraráD:\dir1
.Puede obtener el nombre del archivo, pero también puede obtener la ruta completa, dependiendo de lo que coloque entre '% ~' y '0'. Elige entre
Por ejemplo, desde el interior de c: \ tmp \ foo.bat,
%~nx0
le da "foo.bat", mientras que%~dpnx0
le 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 lo intenta%~xnpd0
, aún obtiene "c: \ tmp \ foo.bat"fuente
f
es el nombre del archivo, pero en sus ejemplos lo usan
para el nombre del archivo. Después de algunas pruebas, parece quef
es la ruta completa yn
es el nombre del archivo.%~xnpd0
" ... te amo.Usando el siguiente script, basado en la respuesta de SLaks, determiné que la respuesta correcta es:
Y aquí está mi guión de prueba:
Lo que encuentro interesante es que % nx0 no funcionará, dado que sabemos que el carácter '~' generalmente se usa para quitar / recortar comillas de una variable.
fuente
Tenga en cuenta que
0
es un caso especial de números de parámetro dentro de un archivo por lotes, donde0
significa este archivo como se indica en la línea de comando .Entonces, si el archivo es myfile.bat, puede llamarlo de varias maneras de la siguiente manera, cada una de las cuales le dará una salida diferente del uso de
%0
o%~0
:myfile
myfile.bat
mydir\myfile.bat
c:\mydir\myfile.bat
"c:\mydir\myfile.bat"
Todo lo anterior son llamadas legales si lo llama desde el lugar relativo correcto al directorio en el que existe.
%~0
elimina las comillas del último ejemplo, mientras%0
que no lo hace.Porque todos estos dan resultados diferentes
%0
y%~0
es muy poco probable que sean los que realmente desea usar.Aquí hay un archivo por lotes para ilustrar:
fuente
Intente ejecutar el siguiente ejemplo para sentir cómo funcionan las variables mágicas.
Se siguen las reglas relacionadas.
fuente
A continuación se muestra mi código inicial:
Me di cuenta de que el nombre de archivo proporcionado por% ~ 0 y% 0 es la forma en que se ingresó en el shell de comandos y no el nombre real de ese archivo. Entonces, si desea que se use el caso literal 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.
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 de variables. ¡Entonces% Path% sería muy largo!
Sin embargo, esto no es tan sólido como la solución de Jool (% ~ x0) anterior.
Mi evidencia:
Aquí está el código final
fuente