2009-03-11 9 views
168

Quiero obtener el nombre del archivo de proceso por lotes actualmente ejecutado sin la extensión del archivo.¿Cuál es la mejor manera de hacer una subcadena en un archivo por lotes?

Gracias a this link, que tienen el nombre de archivo con la extensión ... pero ¿cuál es la mejor manera de hacer una subcadena en un archivo por lotes?

¿O hay otra forma de obtener el nombre del archivo sin la extensión?

Es seguro asumir 3 extensiones de letras en este escenario.

Respuesta

346

Bueno, solo por obtener el nombre de archivo de su lote la manera más fácil sería simplemente usar %~n0.

@echo %~n0 

le mostrará el nombre (sin la extensión) del archivo por lotes se ejecuta actualmente (a no ser ejecutado en una subrutina llamada por call). La lista completa de tales sustituciones “especiales” para los nombres de ruta se puede encontrar con help for, al final de la ayuda:

Además, la sustitución de las referencias a variables PARA se ha mejorado. Ahora puede utilizar el siguiente sintaxis opcional:

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

Los modificadores se pueden combinar para obtener resultados compuestos:

%~dpI  - expands %I to a drive letter and path only 
%~nxI  - expands %I to a file name and extension only 
%~fsI  - expands %I to a full path name with short names only 

Para responder con precisión a su pregunta, sin embargo: Subcadenas terminado de usar la notación :~start,length:

%var:~10,5% 

extraerá 5 caracteres de la posición 10 en la variable de entorno %var%.

NOTA: El índice de las cuerdas se basa cero, por lo que el primer carácter está en la posición 0, el segundo a 1, etc.

Para obtener subcadenas de variables de argumentos tales como %0, %1, etc. . tiene que asignar a una variable de entorno normal usando set primera:

:: Does not work: 
@echo %1:~10,5 

:: Assign argument to local variable first: 
set var=%1 
@echo %var:~10,5% 

La sintaxis es aún más potente:

  • %var:~-7% extrae los últimos 7 caracteres de %var%
  • %var:~0,-4% se extraerían todos los caracteres excepto el último de cuatro que también le libraría de la extensión de archivo (suponiendo tres caracteres después del período [.]).

Consulte help set para obtener detalles sobre esa sintaxis.

+0

Esa es una gran respuesta completa. Muchas gracias. – JosephStyons

+0

Bueno, esas son ahora tres respuestas enrolladas en una o más, gracias a Patrick :) – Joey

+18

La extracción de subcadena no funciona con las variables de bucle FOR tampoco, así que tendrás que hacer lo siguiente (\ r \ n en la línea de código se rompe porque SO parece no permitir saltos de línea en los comentarios): 'setlocal ENABLEDELAYEDEXPANSION \ r \ n para/f %% s en ('set') do (\ r \ n \t conjunto tmp = %% s \ r \ n \t echo! Tmp: ~ -3! \ R \ n ) ' – Fr0sT

26

¡Bien explicado arriba!

Para todos aquellos que pueden sufrir como yo para conseguir este trabajo en un entorno Windows localizada (la mía es XP en eslovaco), puede intentar sustituir la % con un !

Así:

SET TEXT=Hello World 
SET SUBSTRING=!TEXT:~3,5! 
ECHO !SUBSTRING! 
+18

Tenga en cuenta que esto solo funcionará después del comando' setlocal ENABLEDELAYEDEXPANSION' – Fr0sT

+0

O si llama a la línea de comando con/V, es decir 'cmd/v' – Omertron

11

Como información adicional a la respuesta de Joey, que no se describe en la ayuda de set /? ni for /?.

%~0 se expande al nombre del lote, exactamente como se escribió.
lo tanto, si se inicia el proceso por lotes que se ampliará como

%~0 - mYbAtCh 
%~n0 - mybatch 
%~nx0 - mybatch.bat 

Pero hay una excepción, expandiéndose en una subrutina puede fallar

echo main- %~0 
call :myFunction 
exit /b 

:myFunction 
echo func - %~0 
echo func - %~n0 
exit /b 

Esto da lugar a

main - myBatch 
Func - :myFunction 
func - mybatch 

En una función %~0 se expande siempre al nombre de la función, no del archivo por lotes.
¡Pero si usa al menos un modificador, volverá a mostrar el nombre del archivo!

Cuestiones relacionadas