batch file - cortar - ¿Cuál es la mejor manera de hacer una subcadena en un archivo por lotes?
string operation batch file (3)
¡Bien explicado arriba!
Para todos aquellos que pueden sufrir como yo que funcione en un Windows localizado (el mío es XP en eslovaco), ¡puedes intentar reemplazar el %
con a !
Asi que:
SET TEXT=Hello World
SET SUBSTRING=!TEXT:~3,5!
ECHO !SUBSTRING!
Deseo obtener el nombre del archivo por lotes actualmente en ejecución sin la extensión del archivo.
Gracias a este enlace , tengo el nombre del 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.
Como información adicional a la respuesta de Joey, que no se describe en la ayuda de set /?
ni for /?
.
%~0
expande al nombre del propio lote, exactamente como se escribió.
Entonces, si comienzas tu lote, se expandirá como
%~0 - mYbAtCh
%~n0 - mybatch
%~nx0 - mybatch.bat
Pero hay una excepción, la expansión en una subrutina podría fallar
echo main- %~0
call :myFunction
exit /b
:myFunction
echo func - %~0
echo func - %~n0
exit /b
Esto resulta en
main - myBatch
Func - :myFunction
func - mybatch
En una función %~0
expande siempre al nombre de la función, no del archivo por lotes.
¡Pero si usas al menos un modificador, volverá a mostrar el nombre del archivo!
Bueno, solo por obtener el nombre de archivo de tu lote, la forma más fácil sería usar %~n0
.
@echo %~n0
dará como resultado el nombre (sin la extensión) del archivo por lotes actualmente en ejecución (a menos que se ejecute 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, se ha mejorado la sustitución de las referencias de variable FOR. Ahora puede usar la 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
Sin embargo, para responder con precisión a tu pregunta: las subcadenas se hacen usando la notación de: :~start,length
:
%var:~10,5%
extraerá 5 caracteres de la posición 10 en la variable de entorno %var%
.
NOTA: El índice de las cadenas está basado en cero, por lo que el primer carácter está en la posición 0, el segundo en 1, etc.
Para obtener subcadenas de variables de argumento como %0
, %1
, etc., debe asignarlas a una variable de entorno normal utilizando primero set
:
:: 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 poderosa:
-
%var:~-7%
extrae los últimos 7 caracteres de%var%
-
%var:~0,-4%
extraería todos los caracteres, excepto los últimos cuatro, lo que también eliminaría la extensión del archivo (asumiendo tres caracteres después del punto [.
]).
Consulte la help set
para obtener detalles sobre esa sintaxis.