porque no funciona el "set m=%t:~0,x%" (Es decir, porque
la x no actua como variable)
Lo primero de todo es que en ese ejemplo estás escribiendo una x literal, no una variable.
Una x:
Una variable:
Entonces añadiendo los caracteres que faltan, nos quedaría así la sintaxis:
Pero de todas formas los caracteres "%" de inicio y fin de variable de la variable "%X%" entrarían en conflicto con los caracteres "%" de la otra variable "%T%", y esto es lo que conseguirías:
%t:~0,%x%%Lo que he marcado en rojo es lo que Batch tomaría como la primera variable, desde el primer caracter "%" hasta el segundo "%",
lo que he resaltado en en verde se tomaría como un string,
y lo que he resaltado en amarillo es lo que se tomaría como otra variable, o en este caso como un escape del operador "%".
Como puedes entender a simple vista eso no podría funcionar jamás porque como resultado se habrán parseado mal los datos, obteniendo más datos y variables de las que en realidad tenemos.
Entonces al intentar realizar el substring (var:~0,1) y al intentar mostrar el resultado con "echo %m%", esto es lo que Batch te mostraría:
El string (x) y el operador escapado % (%%), eso es lo que Batch ha podido entender.
Es por esa razón que se deben expandir las variables en tiempo de ejecución en lugar de parsearlas,
o en su defecto también podemos usar la recursividad con el comando Call para parsear las variables.
Lee acerca del comando
Setlocal EnableDelayedExpansion y su utilización.
Te muestro dos alternativas funcionales:
Saludos.