Page 1 of 1

If statement variable problem

Posted: 21 Aug 2021 17:00
by PlateauRealm
I'm a little baffled by this batch code here.
I have similar code structure before and outside of a conditional 'if' statement, but the rand2 value
inside the conditional is always seen as a zero value in the 'set hexa2=!HEXA:~%rand2%,2!' line.

Code: Select all

@echo off
cls

SETLOCAL ENABLEDELAYEDEXPANSION

set HEXA=1B1F2E303E474E4F575E5F6087909FA0B0D0D7DFE0F4

:THIS_WORKS
set /A rand1=%random% %% 22
set hexa1=!HEXA:~%rand1%,2!
color !hexa1!

pause

cls

set WONKY=ZZ

:THIS_DOES_NOT_WORK_AS_INTENDED
if "!WONKY!"=="ZZ" (
	echo Inside the 'if' conditional. Good so far.
	set /A rand2=%random% %% 22
	echo rand2 is a new random number every time: !rand2!	Good so far, but
	echo  rand2 is always interpreted as a '0' value in the following 'set hexa2=...' line
	set hexa2=!HEXA:~%rand2%,2!
	color !hexa2!
	echo  and color ^^!hexa2^^! always results in a screen / text color of '1B'
)

pause

:END
What obvious thing have I overlooked here? The code structure seems straight-forward enough.

Thanks.

Re: If statement variable problem

Posted: 22 Aug 2021 05:16
by aGerman
The %rand2% in set hexa2=!HEXA:~%rand2%,2! needs delayed expansion in order to access the updated value. However, nesting of two variables won't work if both variables use exclamation points. One of the possible workarounds is to cache the value in a FOR variable.
Also, since you have 22 pairs of hex digits in your string you'll need to double the 0..21 the modulo operation yields.

Steffen

Code: Select all

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set "HEXA=1B1F2E303E474E4F575E5F6087909FA0B0D0D7DFE0F4"
set "WONKY=ZZ"

if "!WONKY!"=="ZZ" (
	set /A "rand2=!random! %% 22 * 2"
	for %%i in (!rand2!) do color !HEXA:~%%i,2!
)

pause