%x:~12,3%
Returns 3 characters starting at the 12:th character in x variable.
What I have been trying to accomplish is using variables instead of 12
and 3
.
Let's say y=12
and z=3
.
Then, you can't use %x:~%y%,%z%%
, because CMD will think %x:~%
is a variable.
What you can do is set var=%%x:~%y%,%z%%%
. This will expand the inside variables y
and z
, but not x
, so that the value of var
is %x:~12,3%
.
The remaining task at hand now is to finally expand %x:~12,3%
. I have been trying to append echo
in the beginning so that var=echo %x:~12,3%
.
If at the commandline or in a batch file you now use %var%
, this should execute the echo command, and expand the succeeding expression, but it doesnt, instead echo %x:~12,3%
results in simply %x:~12,3%
being printed to the screen, unexpanded.
I was thinking that maybe if you set var to %x:~12,3%
, then echo it
and pipe the output into another ECHO
command or SET
command that the expression would be expanded, but it seems that ECHO
and SET
doesn't accept data being piped into it at all?
How can I make this work?
I copied the entire text below from this answer; I just changed the names of variables and particular examples to match the ones of this question:
If you want to use another variables for substring position and lenght, then you must know that the replacement of variables enclosed in percents by their values is parsed from left to right; this mean that:
%x:~%y%,%z%%
don't give the desired result because it mean: show the value ofx:~
variable, followed byy
, followed by the value of,
variable, etc.To solve this problem you must use Delayed Expansion, that is, insert
setlocal EnableDelayedExpansion
command at beginning, enclose substring variables in percents, and enclose the original variable in exclamation marks:You may also use parameters of FOR commands as indexes:
for /F "tokens=1,2" %%i in ("%y% %z%") do set var=!x:~%%i,%%j!
.To get the value of a substring when the index change inside FOR/IF enclose the variable in double percents and precede the command with
call
. For example, to show a substring at a randomy
position between 0 and 12 and lenghtz
:You may also use this method outside parentheses in order to avoid the Delayed Expansion:
Another way to achieve previous process is using an additional FOR command to change the delayed expansion of the index by an equivalent replaceable parameter, and then use the delayed expansion for the original variable. This method run faster than previous CALL:
You need to enable delayed expansion.
Two methods - the first in standard mode and the second using
delayedexpansion
. There are hundreds of examples on SO about delayedexpansion.