Environment Variable " " not defined - batch-file

: arena1.2
cls
set /a EnemyName= (%random% %% 20)+1
if %EnemyName% equ 1 set %EnemyName1% Racket
if %EnemyName% equ 2 set %EnemyName1% Amok
if %EnemyName% equ 3 set %EnemyName1% Banter
if %EnemyName% equ 4 set %EnemyName1% Drollery
if %EnemyName% equ 5 set %EnemyName1% Keumray
if %EnemyName% equ 6 set %EnemyName1% Quaemi
if %EnemyName% equ 7 set %EnemyName1% Raksul
if %EnemyName% equ 8 set %EnemyName1% Nafl
if %EnemyName% equ 9 set %EnemyName1% Zoda
if %EnemyName% equ 10 set %EnemyName1% Finje
if %EnemyName% equ 11 set %EnemyName1% Liffin
if %EnemyName% equ 12 set %EnemyName1% Reafdaw
if %EnemyName% equ 13 set %EnemyName1% Gleadey
if %EnemyName% equ 14 set %EnemyName1% Gant
if %EnemyName% equ 15 set %EnemyName1% Prooq
if %EnemyName% equ 16 set %EnemyName1% Nazu
if %EnemyName% equ 17 set %EnemyName1% Jape
if %EnemyName% equ 18 set %EnemyName1% Ridiculous
if %EnemyName% equ 19 set %EnemyName1% Vicious
if %EnemyName% equ 20 set %EnemyName1% Ludicrous
if %EnemyName% equ 21 set %EnemyName1% Bedlam
set /a EnemyTitle= (%random% %% 20)+1
if %EnemyTitle% equ 1 set %enemyt% The Hammer
if %EnemyTitle% equ 2 set %enemyt% The Destroyer
if %EnemyTitle% equ 3 set %enemyt% The Mountain
if %EnemyTitle% equ 4 set %enemyt% The Filthy
if %EnemyTitle% equ 5 set %enemyt% The Ugly
if %EnemyTitle% equ 6 set %enemyt% The Handsome
if %EnemyTitle% equ 7 set %enemyt% The Inconsiderate
if %EnemyTitle% equ 8 set %enemyt% The Friendly
if %EnemyTitle% equ 9 set %enemyt% The Biter
if %EnemyTitle% equ 10 set %enemyt% The Muzzled
if %EnemyTitle% equ 11 set %enemyt% The Claw
if %EnemyTitle% equ 12 set %enemyt% The Scarred
if %EnemyTitle% equ 13 set %enemyt% The Burned
if %EnemyTitle% equ 14 set %enemyt% The Flammable
if %EnemyTitle% equ 15 set %enemyt% The Extinguisher of Life
if %EnemyTitle% equ 16 set %enemyt% The Dumb
if %EnemyTitle% equ 17 set %enemyt% The Smart
if %EnemyTitle% equ 18 set %enemyt% The Wise
if %EnemyTitle% equ 19 set %enemyt% The Old
if %EnemyTitle% equ 20 set %enemyt% The Necromancer
if %EnemyTitle% equ 21 set %enemyt% The Revived
echo.
echo And in this corner, %EnemyName1% %enemyt%!
echo.
pause

1
your if is ok. It's your set that is wrong. It should read set EnemyName1=Racket – Stephan 10 mins ago
thanks this works.

Related

Problem with using choice command - batch

i am trying to make character ("o") be able to enter both of the buldings, i've tried everything:
detecting %pos% so when its 5 it goes to :fishing store
adding "e" to choices so if i press e and %pos% equals 5 them goto :fishing store
(none of them worked, beacause i am doing something wrong and i don't know what)
ill be greatfull if someone will respond quickly
here is the code:
#echo off
title outside
mode 45,10
set/a pos=11
set "y7=[fishing] [ fanta's ]"
set "y6=[ store ] [ house ]"
set "y5=H-------H H---------H"
set "y4=H_II____H H_II______H"
set "y3=H___[ ]_H__o__H___[ ]___H__________"
set "y2=::::::::::::::::::::::::H\/\/H\/\/H"
set "y1=::::::::::::::::::::::::H/\/\H/\/\H~~~~~~~~~~"
echo %y7%
echo %y6%
echo %y5%
echo %y4%
echo %y3%
echo %y2%
echo %y1%
goto movement
:movement
choice /c ad /n
if %errorlevel% equ 1 goto left
if %errorlevel% equ 2 goto right
:left
if %pos% gtr 1 set /a pos-=1
goto position
:right
if %pos% lss 32 set /a pos+=1
goto position
:position
if %pos% EQU 1 set "y3=o___[ ]_H_____H___[ ]___H__________"
if %pos% EQU 2 set "y3=Ho__[ ]_H_____H___[ ]___H__________"
if %pos% EQU 3 set "y3=H_o_[ ]_H_____H___[ ]___H__________"
if %pos% EQU 4 set "y3=H__o[ ]_H_____H___[ ]___H__________"
if %pos% EQU 5 set "y3=H___[o]_H_____H___[ ]___H__________"
if %pos% EQU 6 set "y3=H___[ ]oH_____H___[ ]___H__________"
if %pos% EQU 7 set "y3=H___[ ]_o_____H___[ ]___H__________"
if %pos% EQU 8 set "y3=H___[ ]_Ho____H___[ ]___H__________"
if %pos% EQU 9 set "y3=H___[ ]_H_o___H___[ ]___H__________"
if %pos% EQU 10 set "y3=H___[ ]_H__o__H___[ ]___H__________"
if %pos% EQU 11 set "y3=H___[ ]_H___o_H___[ ]___H__________"
if %pos% EQU 12 set "y3=H___[ ]_H____oH___[ ]___H__________"
if %pos% EQU 13 set "y3=H___[ ]_H_____o___[ ]___H__________"
if %pos% EQU 14 set "y3=H___[ ]_H_____Ho__[ ]___H__________"
if %pos% EQU 15 set "y3=H___[ ]_H_____H_o_[ ]___H__________"
if %pos% EQU 16 set "y3=H___[ ]_H_____H__o[ ]___H__________"
if %pos% EQU 17 set "y3=H___[ ]_H_____H___[o]___H__________"
if %pos% EQU 18 set "y3=H___[ ]_H_____H___[ ]o__H__________"
if %pos% EQU 19 set "y3=H___[ ]_H_____H___[ ]_o_H__________"
if %pos% EQU 20 set "y3=H___[ ]_H_____H___[ ]__oH__________"
if %pos% EQU 21 set "y3=H___[ ]_H_____H___[ ]___o__________"
if %pos% EQU 22 set "y3=H___[ ]_H_____H___[ ]___Ho_________"
if %pos% EQU 23 set "y3=H___[ ]_H_____H___[ ]___H_o________"
if %pos% EQU 24 set "y3=H___[ ]_H_____H___[ ]___H__o_______"
if %pos% EQU 25 set "y3=H___[ ]_H_____H___[ ]___H___o______"
if %pos% EQU 26 set "y3=H___[ ]_H_____H___[ ]___H____o_____"
if %pos% EQU 27 set "y3=H___[ ]_H_____H___[ ]___H_____o____"
if %pos% EQU 28 set "y3=H___[ ]_H_____H___[ ]___H______o___"
if %pos% EQU 29 set "y3=H___[ ]_H_____H___[ ]___H_______o__"
if %pos% EQU 30 set "y3=H___[ ]_H_____H___[ ]___H________o_"
if %pos% EQU 31 set "y3=H___[ ]_H_____H___[ ]___H_________o"
:fanta's house
cls
echo you are at fanta's house
pause
:fishing store
cls
echo you are at fishing store
pause
:print
cls
echo %y7%
echo %y6%
echo %y5%
echo %y4%
echo %y3%
echo %y2%
echo %y1%
if %pos% EQU 5 choice /c ead /n >nul
if %errorlevel% equ 1 goto :fishing store
if %pos% EQU 17 choice /c ead /n >nul
if %errorlevel% equ 1 goto :fanta's house
if %errorlevel% equ 2 goto :left
if %errorlevel% equ 3 goto :right
goto movement
Firstly, make sure your file extension is .cmd and not .bat
Then something like this should help guide you.
Just replace your print section with this:
:print
cls
echo %y7%
echo %y6%
echo %y5%
echo %y4%
echo %y3%
echo %y2%
echo %y1%
if %pos% EQU 5 choice /c ead /n >nul
if %errorlevel% equ 1 goto :fishingstore
if %errorlevel% equ 2 goto :left
if %errorlevel% equ 3 goto :right
if %pos% EQU 17 choice /c ead /n >nul
if %errorlevel% equ 1 goto :fantashouse
if %errorlevel% equ 2 goto :left
if %errorlevel% equ 3 goto :right
goto movement
As you seemed to have changed your original code, try this exact full version:
#echo off
title outside
mode 45,10
set/a pos=11
set "y7=[fishing] [ fanta's ]"
set "y6=[ store ] [ house ]"
set "y5=H-------H H---------H"
set "y4=H_II____H H_II______H"
set "y3=H___[ ]_H__o__H___[ ]___H__________"
set "y2=::::::::::::::::::::::::H\/\/H\/\/H"
set "y1=::::::::::::::::::::::::H/\/\H/\/\H~~~~~~~~~~"
echo %y7%
echo %y6%
echo %y5%
echo %y4%
echo %y3%
echo %y2%
echo %y1%
goto movement
:movement
choice /c ad /n
if %errorlevel% equ 1 goto left
if %errorlevel% equ 2 goto right
:left
if %pos% gtr 1 set /a pos-=1
goto position
:right
if %pos% lss 32 set /a pos+=1
goto position
:position
if %pos% EQU 1 set "y3=o___[ ]_H_____H___[ ]___H__________"
if %pos% EQU 2 set "y3=Ho__[ ]_H_____H___[ ]___H__________"
if %pos% EQU 3 set "y3=H_o_[ ]_H_____H___[ ]___H__________"
if %pos% EQU 4 set "y3=H__o[ ]_H_____H___[ ]___H__________"
if %pos% EQU 5 set "y3=H___[o]_H_____H___[ ]___H__________"
if %pos% EQU 6 set "y3=H___[ ]oH_____H___[ ]___H__________"
if %pos% EQU 7 set "y3=H___[ ]_o_____H___[ ]___H__________"
if %pos% EQU 8 set "y3=H___[ ]_Ho____H___[ ]___H__________"
if %pos% EQU 9 set "y3=H___[ ]_H_o___H___[ ]___H__________"
if %pos% EQU 10 set "y3=H___[ ]_H__o__H___[ ]___H__________"
if %pos% EQU 11 set "y3=H___[ ]_H___o_H___[ ]___H__________"
if %pos% EQU 12 set "y3=H___[ ]_H____oH___[ ]___H__________"
if %pos% EQU 13 set "y3=H___[ ]_H_____o___[ ]___H__________"
if %pos% EQU 14 set "y3=H___[ ]_H_____Ho__[ ]___H__________"
if %pos% EQU 15 set "y3=H___[ ]_H_____H_o_[ ]___H__________"
if %pos% EQU 16 set "y3=H___[ ]_H_____H__o[ ]___H__________"
if %pos% EQU 17 set "y3=H___[ ]_H_____H___[o]___H__________"
if %pos% EQU 18 set "y3=H___[ ]_H_____H___[ ]o__H__________"
if %pos% EQU 19 set "y3=H___[ ]_H_____H___[ ]_o_H__________"
if %pos% EQU 20 set "y3=H___[ ]_H_____H___[ ]__oH__________"
if %pos% EQU 21 set "y3=H___[ ]_H_____H___[ ]___o__________"
if %pos% EQU 22 set "y3=H___[ ]_H_____H___[ ]___Ho_________"
if %pos% EQU 23 set "y3=H___[ ]_H_____H___[ ]___H_o________"
if %pos% EQU 24 set "y3=H___[ ]_H_____H___[ ]___H__o_______"
if %pos% EQU 25 set "y3=H___[ ]_H_____H___[ ]___H___o______"
if %pos% EQU 26 set "y3=H___[ ]_H_____H___[ ]___H____o_____"
if %pos% EQU 27 set "y3=H___[ ]_H_____H___[ ]___H_____o____"
if %pos% EQU 28 set "y3=H___[ ]_H_____H___[ ]___H______o___"
if %pos% EQU 29 set "y3=H___[ ]_H_____H___[ ]___H_______o__"
if %pos% EQU 30 set "y3=H___[ ]_H_____H___[ ]___H________o_"
if %pos% EQU 31 set "y3=H___[ ]_H_____H___[ ]___H_________o"
:print
cls
echo %y7%
echo %y6%
echo %y5%
echo %y4%
echo %y3%
echo %y2%
echo %y1%
if %pos% EQU 5 choice /c ead /n >nul
if %errorlevel% equ 1 goto :fishingstore
if %pos% EQU 17 choice /c ead /n >nul
if %errorlevel% equ 1 goto :fantashouse
if %errorlevel% equ 2 goto :left
if %errorlevel% equ 3 goto :right
goto movement
goto :EOF
:fantashouse
cls
echo you are at fanta's house
choice /c ce /m "Continue or exit?"
if %errorlevel% equ 2 goto :print
pause
goto :EOF
:fishingstore
cls
echo you are at fishing store
choice /c ce /m "Continue or exit?"
if %errorlevel% equ 2 goto :print
pause
goto :EOF
#ECHO OFF
SETLOCAL
title outside
rem mode 45,10
set/a pos=11
:position
set "y3=H___[ ]_H_____H___[ ]___H__________"
SET /a y7=pos+1
CALL SET "y3=%%y3:~0,%pos%%%o%%y3:~%y7%%%"
set "y7=[fishing] [ fanta's ]"
set "y6=[ store ] [ house ]"
set "y5=H-------H H---------H"
set "y4=H_II____H H_II______H"
set "y2=::::::::::::::::::::::::H\/\/H\/\/H"
set "y1=::::::::::::::::::::::::H/\/\H/\/\H~~~~~~~~~~"
cls
echo %y7%
echo %y6%
echo %y5%
echo %y4%
echo %y3%
echo %y2%
echo %y1%
:: goto movement
:movement
SET "choices=ad"
IF %pos% equ 5 SET "choices=ade"
IF %pos% equ 19 SET "choices=ade"
choice /c %choices% /n
if %errorlevel% equ 1 goto left
if %errorlevel% equ 2 goto right
IF %pos% equ 19 GOTO fanta's
IF %pos% equ 5 GOTO fishing
:left
if %pos% geq 1 set /a pos-=1
goto position
:right
if %pos% lss 32 set /a pos+=1
goto position
:fanta's house
cls
echo you are at fanta's house
pause
goto position
:fishing store
cls
echo you are at fishing store
pause
goto position
GOTO :EOF
A somewhat re-written version.
Since all that changes on the map is the position of o, place the o on the appropriate position on the line y3.
the first character in a string is "character 0" (hence, it's legitimate for pos to reach 0 - and gtr becomes geq in left:). Batch can substring using the syntax var:~start,length where start is the starting character number (or character-count from end, if negative) and length is number of characters (if negative, number of characters to not include).
So, we need to select that part of y3 from the start to pos, then the o and then the remainder of y3 starting at pos+1.
Hence - calculate pos+1 as batch can't apply a calculation in the substring formula and put the result in a temporary variable. I chose y7 since it's about to be reset anyway. and then use the parser to complete the extraction.
The parser examines CALL SET "y3=%%y3:~0,%pos%%%o%%y3:~%y7%%%" and replaces, left-to-right (let's assume pos=11, hence y7=12) %% with % and %var% with var's value since the set is being called:
set "y3=% y3:~0, 11 % o % y3:~ 12 %" (spaces inserted to show parser's steps)
set "y3=%y3:~0,11%o%y3:~12%" (as executed)
which places the o appropriately, depending on pos.
Our next step is whether o is at position 5 or 19 (not 17), when we need to allow e as well as a and d in the choice. Simply append the e in these circumstances, and choice will yield errorlevel 1 for a, 2 for d and 3 for e (but only if e is one of the choices).
Then - well, if choice has returned errorlevel 1 or 2, go left/right and if it's neither of those, then it must be 3, so e was pressed and we can look at pos to see which of the two routines to jump to.
Note that a label can't contain spaces, so if you tried fanta's house fanta's shop and fanta's tennis court then only the label fanta's would be interpreted (it's unusual, but not invalid, to use ' in a label). cmd would search for the next label fanta's following the goto as its destination, which might give the illusion of working correctly - but that's a trap...

Is it possible to make a randomly generated variable in batch? [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 3 years ago.
Improve this question
Currently I am making a game in batch that has randomly generated worlds. I'm currently working on biome generation, and I'm trying to figure out a way to have each variable generated, so the variables will look like %biomenum[0,0]%, %biomenum[0,1]%, and going maybe as far as %biomenum[512,512]% and as low as %biomenum[-512,-512]
The code that I have currently generates the biome for 9 different chunks, but it doesn't make the variables itself, and typing this out for each chunk between -512, -512 and 512, 512 doesn't seem all that plausible
rem 0x 0y
set /A biomenum0x0y = %RANDOM% * 16 / 32768 + 1
rem 0x 1y
set /A nextbiomenum = %RANDOM% * 4 / 32768 + 1
if /I "%nextbiomenum%" EQU "1" set /A biomenum0x1y = biomenum0x0y + 1
if /I "%nextbiomenum%" EQU "2" set /A biomenum0x1y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "3" set /A biomenum0x1y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "4" set /A biomenum0x1y = biomenum0x0y - 1
rem 1x 1y
set /A nextbiomenum = %RANDOM% * 4 / 32768 + 1
if /I "%nextbiomenum%" EQU "1" set /A biomenum1x1y = biomenum0x0y + 1
if /I "%nextbiomenum%" EQU "2" set /A biomenum1x1y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "3" set /A biomenum1x1y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "4" set /A biomenum1x1y = biomenum0x0y - 1
rem 1x 0y
set /A nextbiomenum = %RANDOM% * 4 / 32768 + 1
if /I "%nextbiomenum%" EQU "1" set /A biomenum1x0y = biomenum0x0y + 1
if /I "%nextbiomenum%" EQU "2" set /A biomenum1x0y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "3" set /A biomenum1x0y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "4" set /A biomenum1x0y = biomenum0x0y - 1
rem 1x -1y
set /A nextbiomenum = %RANDOM% * 4 / 32768 + 1
if /I "%nextbiomenum%" EQU "1" set /A biomenum1xneg1y = biomenum0x0y + 1
if /I "%nextbiomenum%" EQU "2" set /A biomenum1xneg1y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "3" set /A biomenum1xneg1y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "4" set /A biomenum1xneg1y = biomenum0x0y - 1
rem 0x -1y
set /A nextbiomenum = %RANDOM% * 4 / 32768 + 1
if /I "%nextbiomenum%" EQU "1" set /A biomenum0xneg1y = biomenum0x0y + 1
if /I "%nextbiomenum%" EQU "2" set /A biomenum0xneg1y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "3" set /A biomenum0xneg1y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "4" set /A biomenum0xneg1y = biomenum0x0y - 1
rem -1x -1y
set /A nextbiomenum = %RANDOM% * 4 / 32768 + 1
if /I "%nextbiomenum%" EQU "1" set /A biomenumneg1xneg1y = biomenum0x0y + 1
if /I "%nextbiomenum%" EQU "2" set /A biomenumneg1xneg1y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "3" set /A biomenumneg1xneg1y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "4" set /A biomenumneg1xneg1y = biomenum0x0y - 1
rem -1x 0y
set /A nextbiomenum = %RANDOM% * 4 / 32768 + 1
if /I "%nextbiomenum%" EQU "1" set /A biomenumneg1x0y = biomenum0x0y + 1
if /I "%nextbiomenum%" EQU "2" set /A biomenumneg1x0y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "3" set /A biomenumneg1x0y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "4" set /A biomenumneg1x0y = biomenum0x0y - 1
rem -1x 1y
set /A nextbiomenum = %RANDOM% * 4 / 32768 + 1
if /I "%nextbiomenum%" EQU "1" set /A biomenumneg1x1y = biomenum0x0y + 1
if /I "%nextbiomenum%" EQU "2" set /A biomenumneg1x1y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "3" set /A biomenumneg1x1y = biomenum0x0y + 0
if /I "%nextbiomenum%" EQU "4" set /A biomenumneg1x1y = biomenum0x0y - 1
echo %biomenumneg1xneg1y% is the biome for -1,-1
echo %biomenumneg1x0y% is the biome for -1, 0
echo %biomenumneg1x1y% is the biome for -1, 1
echo %biomenum0xneg1y% is the biome for 0, -1
echo %biomenum0x0y% is the biome for 0, 0 -the starting chunk-
echo %biomenum0x1y% is the biome for 0, 1
echo %biomenum1xneg1y% is the biome for 1, -1
echo %biomenum1x0y% is the biome for 1, 0
echo %biomenum1x1y% is the biome for 1, 1
How would I be able to automate the creation of variables, so I don't have to type out all 1,048,576 chunks?
*Note: This question was edited so it made more sense. The original was a very long explanation that I made on 3 hours of sleep, and I apologize for that. Hopefully this is a bit more easy to understand.
Your explanation is pretty confusing, both in what you want to get and the way to obtain it...
When you have a series of variables with the same name and you want to select one variable based on the value of another variable (called index), then the name for such a data structure is array. If the array elements are selected by just one index variable (one dimensional array), then it is usually called vector. If the array elements are selected by two or more indices (multi-dimensional array), then it is called matrix.
In computer programs the usual way to repeat the same code over a range of values that are all processed in the same way is via the FOR statement/construct/command. The FOR control variable is placed in the code in the place of the varying value. The usual way to process a series of array elements is via a FOR command and place its control variable as the index of the array element.
The way to process array elements in Batch file programs is described at this answer.
The next Batch file obtain a result equivalent than your example code, but using a two-dimensional array and two nested FOR commands:
#echo off
setlocal EnableDelayedExpansion
rem 0x 0y
set /A biomenum0x0y = %RANDOM% * 16 / 32768 + 1
rem The rest!
for %%x in (neg1 0 1) do (
for %%y in (neg1 0 1) do (
set /A nextbiomenum = !RANDOM! * 4 / 32768 - 1, biomenum%%xx%%yy = biomenum0x0y + nextbiomenum %% 2
)
)
echo %biomenumneg1xneg1y% is the biome for -1,-1
echo %biomenumneg1x0y% is the biome for -1, 0
echo %biomenumneg1x1y% is the biome for -1, 1
echo %biomenum0xneg1y% is the biome for 0, -1
echo %biomenum0x0y% is the biome for 0, 0 -the starting chunk-
echo %biomenum0x1y% is the biome for 0, 1
echo %biomenum1xneg1y% is the biome for 1, -1
echo %biomenum1x0y% is the biome for 1, 0
echo %biomenum1x1y% is the biome for 1, 1
The results obtained by this code are not exactly the same than your code. In your code you add 1 when random is 1 and subtract 1 when random is 4 (and ignore 2 and 3). In my simplification I generate a number between -1 and 2 (instead of 1 to 4) and add 1 when random is 1 and subtract 1 when random is -1 (and ignore 0 and 2); this is done taking the remainder (mod, % operator) of the number divided by 2. The statistical result is, however, the same...
Antonio
PS - I suggest you to use the standard array notation with the subscripts enclosed in square braquets, (like %biomenum[1,0]% or %biomenum[1][0]%instead of %biomenum1x0y% ) for the reasons explained at this post.

Batch - Find Out Permutation

I am new to Batch and I would like to know if I can find out all combinations of numbers in order.
In this case I have 49 Numbers from 1 - 49 , and I have to pick 6 Numbers to be the results.
For example:
1 2 3 4 5 6
1 2 3 4 5 7
...
1 2 3 4 5 49
1 2 3 4 6 7
1 2 3 4 6 8
etc...
This is my old code:
#echo off > NEWFILE & setLocal EnableDelayedExpansion
set a=44
set b=45
set c=46
set d=47
set e=48
set f=49
for /L %%a in (1 1 !a!) do (
for /L %%b in (2 1 !b!) do (
for /L %%c in (3 1 !c!) do (
for /L %%d in (4 1 !d!) do (
for /L %%e in (5 1 !e!) do (
for /L %%f in (6 1 !f!) do (
echo.%%a %%b %%c %%d %%e %%f
))))))) >> NEWFILE
goto :EOF
However it returns:
1 2 3 4 5 6
1 2 3 4 5 7
...
1 2 3 4 5 49
1 2 3 4 6 6
Two 6's appeared.
I don't seem to be able to fix it, please help, thanks very much!
When you post a question you should post your efforts to solve it, describe the method used and the problems you had; otherwise you may get similar answers with no explanations at all, like this one:
EDIT: As users dbenham and aschipfl indicated, my original code have a small bug: the set /A i=M-1 line should be placed after the :nextSet label. This is the right code:
#echo off
setlocal EnableDelayedExpansion
set "N=%1"
set "M=%2"
set "line="
for /L %%i in (1,1,%M%) do (
set "C[%%i]=%%i"
set "line=!line! ^!C[%%i]^!"
)
:nextSet
set /A i=M-1
for /L %%j in (!C[%M%]!,1,%N%) do (
set "C[%M%]=%%j"
echo %line%
)
:nextPos
set "C=!C[%i%]!"
if %C% equ %N% (
set /A i-=1
if !i! equ 0 goto :EOF
goto nextPos
)
for /L %%i in (%i%,1,%M%) do (
set /A C+=1,C[%%i]=C
)
if !C[%M%]! gtr %N% goto nextPos
goto nextSet
Obviously, the corrected code generate a much larger number of results and this version is particularly slow... :(
The new version below use the exact same code of dbenham's solution; its only advantage is that you may change the parameters used to generate the result in a very easy way:
#echo off
setlocal EnableDelayedExpansion
set "N=%1"
set "M=%2"
set /A j=N-M, prev=0
set "for=" & set "line=" & set "endfor="
for /L %%i in (1,1,%M%) do (
set /A j+=1
set "for=!for! set /A start=!prev!+1 & for /L %%%%i in (^!start^!,1,!j!) do ("
set "line=!line! %%%%i"
set "endfor=!endfor!)"
set "prev=%%%%i"
)
REM ECHO !FOR! echo !LINE! %ENDFOR%
%for% echo %line% %endfor%
Output example:
C:\> test.bat 6 4
1 2 3 4
1 2 3 5
1 2 3 6
1 2 4 5
1 2 4 6
1 2 5 6
1 3 4 5
1 3 4 6
1 3 5 6
1 4 5 6
2 3 4 5
2 3 4 6
2 3 5 6
2 4 5 6
3 4 5 6
To get your results, use: test.bat 49 6
2ND EDIT: Faster method added
When the problem to solve is the excessive time a process takes, an obvious alternative is to use a faster programming language. The solution below use JScript, that is somewhat similar to Batch file programming:
#if (#CodeSection == #Batch) #then
#echo off
echo Start: %time%
cscript //nologo //E:JScript "%~F0" > result.txt
echo End: %time%
goto :EOF
#end
// JScript code section
for ( var A=1; A <= 44; ++A ) {
for ( var B=A+1; B <= 45; ++B ) {
for ( var C=B+1; C <= 46; ++C ) {
for ( var D=C+1; D <= 47; ++D ) {
for ( var E=D+1; E <= 48; ++E ) {
for ( var F=E+1; F <= 49; ++F ) {
WScript.Echo(A,B,C,D,E,F);
}
}
}
}
}
}
This is a Batch-JScript hybrid script; save it with .BAT extension. This program took a little less than 9 minutes in my cheap-and-slow lap-top computer to generate a 239 MB file with 13983816 lines.
The problem is compute intensive, given that there are 13,983,816 unique permutations. (See https://en.wikipedia.org/wiki/Lottery_mathematics#Calculation_explained_in_choosing_6_from_49.)
The Rojo answer should work, but the GOTO and repetitive FOR /F parsing and IF logic will slow things down considerably.
The code is much faster if you use nested FOR /L loops.
#echo off
setlocal enableDelayedExpansion
for /l %%A in (1 1 44) do (
set /a start=%%A+1
for /l %%B in (!start! 1 45) do (
set /a start=%%B+1
for /l %%C in (!start! 1 46) do (
set /a start=%%C+1
for /l %%D in (!start! 1 47) do (
set /a start=%%D+1
for /l %%E in (!start! 1 48) do (
set /a start=%%E+1
for /l %%F in (!start! 1 49) do (
echo %%A %%B %%C %%D %%E %%F
)
)
)
)
)
)
This will still be unbearably slow to let this script print the results to the screen. I estimate it will take 1.25 hours on my machine. Redirecting the output to a file is about 5 times faster, around 15 minutes.
In the future, please show some code demonstrating that you've attempted to solve the problem yourself, showing where you got stuck, where the output is not as expected, etc. Questions resembling "Here are my requirements. Code this for me" generally aren't well-received around here. How you got an upvote without showing any code is beyond me, but c'est la vie.
In this instance, I found the problem interesting, so I thought I'd go ahead and get you started. Challenge: accepted. Here's one way to do it.
#echo off
setlocal enabledelayedexpansion
set "series=1 2 3 4 5 6"
:loop
echo %series%
if "%series%"=="44 45 46 47 48 49" goto :EOF
for /f "tokens=1-6" %%a in ("%series%") do (
set /a i1=%%a, i2=%%b, i3=%%c, i4=%%d, i5=%%e, i6=%%f+1
if !i6! gtr 49 set /a i5+=1, i6=i5+1
if !i5! gtr 48 set /a i4+=1, i5=i4+1, i6=i5+1
if !i4! gtr 47 set /a i3+=1, i4=i3+1, i5=i4+1, i6=i5+1
if !i3! gtr 46 set /a i2+=1, i3=i2+1, i4=i3+1, i5=i4+1, i6=i5+1
if !i2! gtr 45 set /a i1+=1, i2=i1+1, i3=i2+1, i4=i3+1, i5=i4+1, i6=i5+1
set "series=!i1! !i2! !i3! !i4! !i5! !i6!"
)
goto loop
Here's another solution that should be more efficient.
#echo off
setlocal enabledelayedexpansion
set "series=1 2 3 4 5 6"
set total=0
for /L %%a in (1,1,44) do (
set /a i2 = %%a + 1
for /L %%b in (!i2!, 1, 45) do (
set /a i3 = %%b + 1
for /L %%c in (!i3!, 1, 46) do (
set /a i4 = %%c + 1
for /L %%d in (!i4!, 1, 47) do (
set /a i5 = %%d + 1
for /L %%e in (!i5!, 1, 48) do (
set /a i6 = %%e + 1
for /L %%f in (!i6!, 1, 49) do (
rem // Uncomment this echo to watch the progress (severely decreases efficiency)
rem echo %%a %%b %%c %%d %%e %%f
set /a total += 1
)
)
)
)
)
echo Total so far: !total!
)
rem // Should have gone through 13983816 iterations

Format a hexadecimal sequence in a cmd.exe batch file

In a Windows cmd script (aka bat script), I have a FOR /L loop from 1 to 8, where I need to do a bit shift and somehow format a variable as a hexadecimal number (which if you ask, is a single CPU identifier bit to feed into /AFFINITY).
I can't figure out how to do the last step. This is my loop.cmd file:
#ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /L %%i IN (1,1,8) DO (
SET /A "J=1<<%%i"
ECHO %%i and !J!
)
which does everything but format a hex number:
1 and 2
2 and 4
3 and 8
4 and 16
5 and 32
6 and 64
7 and 128
8 and 256
expected output is:
1 and 2
2 and 4
3 and 8
4 and 10
5 and 20
6 and 40
7 and 80
8 and 100
How do you format a hexadecimal number?
#ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /L %%i IN (1,1,8) DO (
SET /A "J=1<<%%i"
CALL :DECTOHEX J
ECHO %%i and !J!
)
GOTO :EOF
:DECTOHEX VAR
SET "DEC=!%1!"
SET "HEX="
:NEXT
SET /A DIGIT=DEC%%16, DEC/=16
SET "HEX=%DIGIT%%HEX%"
IF %DEC% NEQ 0 GOTO NEXT
SET "%1=%HEX%"
EXIT /B
EDIT: Reply to the comment
Previous solution works correctly when the shifted value have just one bit on, as stated in the question. If the shifted value may have several bits on then a more general decimal-to-hexadecimal conversion is required, like the one below:
#ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
REM DEFINE THE HEXA DIGITS
SET "HEXA=0123456789ABCDEF"
FOR /L %%i IN (1,1,8) DO (
SET /A "J=3<<%%i"
CALL :DECTOHEX J
ECHO %%i and !J!
)
GOTO :EOF
:DECTOHEX VAR
SET "DEC=!%1!"
SET "HEX="
:NEXT
SET /A DIGIT=DEC%%16, DEC/=16
SET "HEX=!HEXA:~%DIGIT%,1!%HEX%"
IF %DEC% NEQ 0 GOTO NEXT
SET "%1=%HEX%"
EXIT /B
#echo off
setlocal enabledelayedexpansion
set x=2
set n=1
set /a result=n
for /l %%a in (1,1,10) do (
set /a result*=x
if "!result:~0,1!"=="1" set result=!result:16=10!
echo %%a and !result!
)
output:
1 and 2
2 and 4
3 and 8
4 and 10
5 and 20
6 and 40
7 and 80
8 and 100
9 and 200
10 and 400

I am having trouble figuring out any problems with this pseudo-random encounter engine

I just can't figure it out, I have tried and tried.
::Random Encounters
:ree5000
if %level% geq 1 goto reelvl1
:reelvl1
set /a monsterlvl=(4 * %random%) / 32768 + 1
if %monsterlvl% equ 1 goto monsterlvl1
if %monsterlvl% equ 2 goto monsterlvl2
if %monsterlvl% equ 3 goto monsterlvl3
if %monsterlvl% equ 4 goto monsterlvl4
:monsterlvl1
set /a monstertype=(5 * %random%) / 32768 + 1
if %monstertype% equ 1 set monsdis=Goblin
if %monstertype% equ 2 set monsdis=Imp
if %monstertype% equ 3 set monsdis=Rat
if %monstertype% equ 4 set monsdis=Wolf
if %monstertype% equ 5 set monsdis=Slime
set /a mobhealth=(100 * %random%) / 32768 + 1
if %monstertype% equ 1 set mobhealth=%mobhealth% + 10
if %monstertype% equ 2 set mobhealth=%mobhealth% - 20
if %monstertype% equ 3 set mobhealth=%mobhealth% + 15
if %monstertype% equ 4 set mobhealth=%mobhealth% + 50
if %monstertype% equ 5 set mobhealth=%mobhealth% - 50
if %mobhealth% leq 20 set mobhealth=50
set /a mobstr=(15 * %random%) / 32768 + 1
set /a mobdef=(5 * %random%) / 32768 + 1
goto mobencounter
Is the syntax wrong? Am I doing something wrong?
I just want to know how I can fix this and avoid the problem in the future.

Resources