0

The line set cyclezipPPMdd=%cyclezipPPMdd!cycleCount!% in the code below isn't working as I intend to. It should transform !cycleCount! as, for example, 1, and then transform %cyclezipPPMdd!cycleCount!% into cyclezipPPMdd1 and finally set cyclezipPPMdd equal to the value of cyclezipPPMdd1 which is 256m.

I need a rotating value in cyclezipPPMdd.

rem @echo off
setlocal enableDelayedExpansion

: part1
set "cyclezipPPMdd0=256m 128m 64m 32m 16m 8m 4m 2m 1m"
set "memcyclezipPPMdd=258 130 66 34 18 10 6 4 3"

set /a anotherCounter=0
set tempCycle=!cyclezipPPMdd0: =^

!
for /f %%i in ("!tempCycle!") do (
  set /a anotherCounter+=1
  set cyclezipPPMdd!anotherCounter!=%%i
)
set /a cycleCount=0

: part2
set tempMem=!memcyclezipPPMdd: =^

!
for /f %%i in ("!tempMem!") do (
  set /a cycleCount+=1
  set tempMem!cycleCount!=%%i
  set cyclezipPPMdd=%cyclezipPPMdd!cycleCount!%
  set cyclezipPPMdd
  pause
)
set /a anotherCounter=0
set /a cycleCount=0

pause

In the end I am so clueless as to what I need to do to achieve my goal. I'm not a programmer at all. Here's the final goal topic: for and start commands in a batch for parallel and sequential work


EDIT: the too long didn't read version

I need a way to split cyclezipPPMdd0=256m 128m 64m 32m 16m 8m 4m 2m 1m into single pieces, like this:

cyclezipPPMdd0=256m 128m 64m 32m 16m 8m 4m 2m 1m
cyclezipPPMdd1=256m
cyclezipPPMdd2=128m
cyclezipPPMdd3=64m
cyclezipPPMdd4=32m
cyclezipPPMdd5=16m
cyclezipPPMdd6=8m
cyclezipPPMdd7=4m
cyclezipPPMdd8=2m
cyclezipPPMdd9=1m

Those values will directly affect how much memory will be in use by 7z.exe (explained in the other topic), and I need a way to keep track of how much memory is currently in use to determine if the remaining memory would allow me to run another instance of 7z.exe or not. When 7z.exe starts, it will use only one of these values at a time. However, 256m is a value of a parameter for 7z.exe, it is the dictionary size. The real memory usage by this parameter is 258, so, the associated values are like this:

cyclezipPPMdd1=256m <=> tempMem1=258
cyclezipPPMdd2=128m <=> tempMem2=130
cyclezipPPMdd3=64m  <=> tempMem3=66
cyclezipPPMdd4=32m  <=> tempMem4=34
cyclezipPPMdd5=16m  <=> tempMem5=18
cyclezipPPMdd6=8m   <=> tempMem6=10
cyclezipPPMdd7=4m   <=> tempMem7=6
cyclezipPPMdd8=2m   <=> tempMem8=4
cyclezipPPMdd9=1m   <=> tempMem9=3

7z.exe is currently set on my code to read the value from cyclezipPPMdd (without a number). This variable must rotate through all available pieces, split from cyclezipPPMdd0, but is always the same name, cyclezipPPMdd (still without a number).

if defined cyclezipPPMd (
  for %%x IN (%cyclezipPPMdx%) DO for %%t IN (%cyclezipPPMdt%) DO for %%d IN (%cyclezipPPMdd%) DO for %%w IN (%cyclezipPPMdw%) DO (
    set "cmd=7z.exe a teste.resultado\%%xx.ppmd.%%tt.%%dd.%%ww.zip .\teste.original\* -mx=%%x -mm=PPMd:mem=%%d:o=%%w -mmt=%%t"
    call :executeProc
  )
)

The first 7z.exe run would do cyclezipPPMdd=256m, the second run would do cyclezipPPMdd=128m etc... like this:

first run
cyclezipPPMdd1=256m <=> tempMem1=258  -> cyclezipPPMdd=256m
cyclezipPPMdd2=128m <=> tempMem2=130
cyclezipPPMdd3=64m  <=> tempMem3=66
cyclezipPPMdd4=32m  <=> tempMem4=34
cyclezipPPMdd5=16m  <=> tempMem5=18
cyclezipPPMdd6=8m   <=> tempMem6=10
cyclezipPPMdd7=4m   <=> tempMem7=6
cyclezipPPMdd8=2m   <=> tempMem8=4
cyclezipPPMdd9=1m   <=> tempMem9=3

second run
cyclezipPPMdd1=256m <=> tempMem1=258
cyclezipPPMdd2=128m <=> tempMem2=130  -> cyclezipPPMdd=128m
cyclezipPPMdd3=64m  <=> tempMem3=66
cyclezipPPMdd4=32m  <=> tempMem4=34
cyclezipPPMdd5=16m  <=> tempMem5=18
cyclezipPPMdd6=8m   <=> tempMem6=10
cyclezipPPMdd7=4m   <=> tempMem7=6
cyclezipPPMdd8=2m   <=> tempMem8=4
cyclezipPPMdd9=1m   <=> tempMem9=3

third run
cyclezipPPMdd1=256m <=> tempMem1=258
cyclezipPPMdd2=128m <=> tempMem2=130
cyclezipPPMdd3=64m  <=> tempMem3=66   -> cyclezipPPMdd=64m
cyclezipPPMdd4=32m  <=> tempMem4=34
cyclezipPPMdd5=16m  <=> tempMem5=18
cyclezipPPMdd6=8m   <=> tempMem6=10
cyclezipPPMdd7=4m   <=> tempMem7=6
cyclezipPPMdd8=2m   <=> tempMem8=4
cyclezipPPMdd9=1m   <=> tempMem9=3
etc...

However, this is not everything. There is yet another 7z.exe parameter that not only also affect how much memory will be used, but also, how many threads will be used. I don't have this part ready in my script, I'm still trying to figure how to implement it.

first cycle <=> cyclezipPPMdt1=1 <=> tempProc1=8
first run
cyclezipPPMdd1=256m <=> tempMem1=258  -> cyclezipPPMdd=256m
cyclezipPPMdd2=128m <=> tempMem2=130
second run
cyclezipPPMdd1=256m <=> tempMem1=258
cyclezipPPMdd2=128m <=> tempMem2=130  -> cyclezipPPMdd=128m
etc...

second cycle <=> cyclezipPPMdt2=2 <=> tempProc2=4
first run
cyclezipPPMdd1=256m <=> tempMem1=580 -> cyclezipPPMdd=256m
cyclezipPPMdd2=128m <=> tempMem2=324
second run
cyclezipPPMdd1=256m <=> tempMem1=580
cyclezipPPMdd2=128m <=> tempMem2=324 -> cyclezipPPMdd=128m
etc...

The following table shows the relation between memory usage, thread usage and compression strength for zipPPMd algorythm.

@echo off
echo mem=1m 2m 4m 8m 16m 32m 64m 128m 256m
echo o=2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
echo mt=1 2 3 4 5 6 7 8
echo x=1 3 5 7 9
echo 256m 9x 7x 5x 3x 1x 8t - 2320 MB, 7t - 2030 MB, 6t - 1740 MB, 5t - 1450 MB, 4t - 1160 MB, 3t - 870 MB, 2t - 580 MB, 1t - 258 MB
echo 128m 9x 7x 5x 3x 1x 8t - 1296 MB, 7t - 1134 MB, 6t -  972 MB, 5t -  810 MB, 4t -  648 MB, 3t - 486 MB, 2t - 324 MB, 1t - 130 MB
echo  64m 9x 7x 5x 3x 1x 8t -  784 MB, 7t -  686 MB, 6t -  588 MB, 5t -  490 MB, 4t -  392 MB, 3t - 294 MB, 2t - 196 MB, 1t -  66 MB
echo  32m 9x 7x 5x 3x 1x 8t -  528 MB, 7t -  462 MB, 6t -  396 MB, 5t -  330 MB, 4t -  264 MB, 3t - 198 MB, 2t - 132 MB, 1t -  34 MB
echo  16m 9x 7x 5x 3x 1x 8t -  400 MB, 7t -  350 MB, 6t -  300 MB, 5t -  250 MB, 4t -  200 MB, 3t - 150 MB, 2t - 100 MB, 1t -  18 MB
echo   8m 9x 7x 5x 3x 1x 8t -  336 MB, 7t -  294 MB, 6t -  252 MB, 5t -  210 MB, 4t -  168 MB, 3t - 126 MB, 2t -  84 MB, 1t -  10 MB
echo   4m 9x 7x 5x 3x 1x 8t -  304 MB, 7t -  266 MB, 6t -  228 MB, 5t -  190 MB, 4t -  152 MB, 3t - 114 MB, 2t -  76 MB, 1t -   6 MB
echo   2m 9x 7x 5x 3x 1x 8t -  288 MB, 7t -  252 MB, 6t -  216 MB, 5t -  180 MB, 4t -  144 MB, 3t - 108 MB, 2t -  72 MB, 1t -   4 MB
echo   1m 9x 7x 5x 3x 1x 8t -  280 MB, 7t -  245 MB, 6t -  210 MB, 5t -  175 MB, 4t -  140 MB, 3t - 105 MB, 2t -  70 MB, 1t -   3 MB

No matter the compression strength (defined as x in this table, and as %cyclezipPPMdx% on the script), when the dictionary (mem in table, %cyclezipPPMdd% in script) is set to, for example, 256m, the corresponding real memory usage (tempMem#in the script) will be dependant on how many threads (mt in table, %cyclezipPPMdt% in script) are defined.

The sequence set "memcyclezipPPMdd=258 130 66 34 18 10 6 4 3" are from the last column of that table.

Community
  • 1
  • 1
user2896127
  • 195
  • 1
  • 2
  • 7

2 Answers2

1
CALL set cyclezipPPMdd=%%cyclezipPPMdd!cycleCount!%%

in place of your set cyclezipPPMdd=... would seem to do what you seem to want.

It would probably be better to state the problem to be solved as your solution appears to be overly complex. I suppose you have your reasons for waning to write warandpeace as variablenames...

@ECHO OFF
setlocal enableDelayedExpansion

: part1
set "cyclezipPPMdd0=256m 128m 64m 32m 16m 8m 4m 2m 1m"
set "memcyclezipPPMdd=258 130 66 34 18 10 6 4 3"

set /a anotherCounter=0
for %%i in (%cyclezipPPMdd0%) do (
  set /a anotherCounter+=1
  set cyclezipPPMdd!anotherCounter!=%%i
)
set /a cycleCount=0

: part2
for %%i in (%memcyclezipPPMdd%) do (
  set /a cycleCount+=1
  set tempMem!cycleCount!=%%i
  CALL set cyclezipPPMdd=%%cyclezipPPMdd!cycleCount!%%
  set cyclezipPPMdd
  pause
)
SET cyclecount
SET anothercounter
pause
set /a anotherCounter=0
set /a cycleCount=0

GOTO :EOF

would appear to produce the same results. Note that !var!=%var% outside of for loops when enabledelayedexpansion is in effect.

This also sets cyclecount and anothercounter to useful values - the number of elements in the variable.

Taken section-by-section, the below demonstration should show you a few techniques:

first, the extraction to cyclezipPPMdd as you've asked.

then cyclezipPPMdd and cyclezipPPMdd# which contains the corresponding entry in tempmem, which you don't appear to use in your code.

then grabbing different entries from the two lists.

Note that the substitution-sequence is critical. metavariables (%%x for active loop-controls and %n for parameter-numbers) are substituted first!

@ECHO OFF
setlocal enableDelayedExpansion

: part1
set "cyclezipPPMdd0=256m 128m 64m 32m 16m 8m 4m 2m 1m"
set "memcyclezipPPMdd=258 130 66 34 18 10 6 4 3"

set /a anotherCounter=0
for %%i in (%cyclezipPPMdd0%) do (
  set /a anotherCounter+=1
  set cyclezipPPMdd!anotherCounter!=%%i
)
set /a cycleCount=0

: part2
for %%i in (%memcyclezipPPMdd%) do (
  set /a cycleCount+=1
  set tempMem!cycleCount!=%%i
)
for /l %%i in (1,1,%cyclecount%) do (
  CALL set cyclezipPPMdd=%%cyclezipPPMdd%%i%%
  set cyclezipPPMdd
  pause
)
for %%i in (1,7,4,2) do (
  CALL set cyclezipPPMdd=%%cyclezipPPMdd%%i%%
  CALL set cyclezipPPMdd#=%%tempMem%%i%%
  set cyclezipPPMdd
  pause
)
for %%i in (1,7,4,2) do (
 FOR %%j IN (2 6) DO (
  CALL :setz %%i %%j
  SET z
  PAUSE
 )
)
SET cyclecount
SET anothercounter
pause
set /a anotherCounter=0
set /a cycleCount=0

GOTO :EOF

:setz
CALL set zcyclezipPPMdd=%%cyclezipPPMdd%1%% [%1]
CALL set ztempmem=%%tempMem%2%% [%2]
GOTO :eof
Magoo
  • 77,302
  • 8
  • 62
  • 84
0

I was able to do it! The full script currently looks like this:

@echo off
setlocal enableDelayedExpansion

set "maxMem=8192"
set "maxThreads=!NUMBER_OF_PROCESSORS!"
set "memSum=0"
set "memRem="
if not defined memRem set "memRem=!maxMem!"

set "cycle7zBZip2="
set "cyclezipBZip2="
set "cyclezipDeflate64="
set "cyclezipDeflate="
set "cyclezipPPMd="
set "cycle7zLZMA="
set "cycle7zLZMA2="
set "cycle7zPPMd="
set "cyclezipLZMA="

set "maxProc="
set /a "maxProc=maxThreads"

:7zBZip2
set "cycle7zBZip2=1"
set "cycle7zBZip2x=9"
set "cycle7zBZip2t=1"
set /a "tempProc=maxThreads/cycle7zBZip2t"
set "cycle7zBZip2d=900k"
set "tempMem1=39"
set "cycle7zBZip2s=on"
set /a "cycleCount=1"
call :prepareCycle
set "cycle7zBZip2="

:zipBZip2
set "cyclezipBZip2=1"
set "cyclezipBZip2x=9"
set "cyclezipBZip2t=1"
set /a "tempProc=maxThreads/cyclezipBZip2t"
set "cyclezipBZip2d=900k"
set "tempMem1=10"
set /a "cycleCount=1"
call :prepareCycle
set "cyclezipBZip2="

:zipDeflate64
set "cyclezipDeflate64=1"
set "cyclezipDeflate64x=9"
set "cyclezipDeflate64t=1"
set /a "tempProc=maxThreads/cyclezipDeflate64t"
set "cyclezipDeflate64w=257 256 192 128 96 64 48 32 24 16 12 8"
set "tempMem1=4"
set /a "cycleCount=1"
call :prepareCycle
set "cyclezipDeflate64="

:zipDeflate
set "cyclezipDeflate=1"
set "cyclezipDeflatex=9"
set "cyclezipDeflatet=1"
set /a "tempProc=maxThreads/cyclezipDeflatet"
set "cyclezipDeflatew=258 256 192 128 96 64 48 32 24 16 12 8"
set "tempMem1=4"
set /a "cycleCount=1"
call :prepareCycle
set "cyclezipDeflate="

:zipPPMd
set "cyclezipPPMd=1"
set "cyclezipPPMdx=9"
set "cyclezipPPMdt=1"
set /a "tempProc=maxThreads/cyclezipPPMdt"
set "cyclezipPPMdd0=256m 128m 64m 32m 16m 8m 4m 2m 1m"
set /a "anotherCounter=0"
set tempCycle=!cyclezipPPMdd0: =^

!
for /f %%i in ("!tempCycle!") do (
  set /a anotherCounter+=1
  set tempCycle!anotherCounter!=%%i
)
set /a "anotherCounter=0"
set "cyclezipPPMdw=16 15 14 13 12 11 10 9 8 7 6 5 4 3 2"
set "memcyclezipPPMdd=258 130 66 34 18 10 6 4 3"
set tempMem=!memcyclezipPPMdd: =^

!
for /f %%i in ("!tempMem!") do (
  set /a cycleCount+=1
  set tempMem!cycleCount!=%%i
)
call :prepareCycle
set "cyclezipPPMd="

:7zLZMA
set "cycle7zLZMA=1"
set "cycle7zLZMAx=9"
set "cycle7zLZMAt=1"
set /a "tempProc=maxThreads/cycle7zLZMAt"
set "cycle7zLZMAd=512m"
set "cycle7zLZMAw=273 256 192 128 96 64 48 32 24 16 12 8"
set "cycle7zLZMAs=on"
set "tempMem1=5407"
set /a "cycleCount=1"
call :prepareCycle
set "cycle7zLZMA="

:7zLZMA2
set "cycle7zLZMA2=1"
set "cycle7zLZMA2x=9"
set "cycle7zLZMA2t=1"
set /a "tempProc=maxThreads/cycle7zLZMA2t"
set "cycle7zLZMA2d=512m"
set "cycle7zLZMA2w=273 256 192 128 96 64 48 32 24 16 12 8"
set "cycle7zLZMA2s=on"
set "tempMem1=5407"
set /a "cycleCount=1"
call :prepareCycle
set "cycle7zLZMA2="

:7zPPMd
set "cycle7zPPMd=1"
set "cycle7zPPMdx=9"
set /a "tempProc=maxThreads/1"
set "cycle7zPPMdd0=1024m 768m 512m 384m 256m 192m 128m 96m 64m 48m 32m 24m 16m 12m 8m 6m 4m 3m 2m 1m"
set /a "anotherCounter=0"
set tempCycle=!cycle7zPPMdd0: =^

!
for /f %%i in ("!tempCycle!") do (
  set /a anotherCounter+=1
  set tempCycle!anotherCounter!=%%i
)
set /a "anotherCounter=0"
set "cycle7zPPMdw=32 28 24 20 16 14 12 10 8 7 6 5 4 3 2"
set "cycle7zPPMds=on"
set "memcycle7zPPMdd=1055 799 543 415 287 223 159 127 95 79 63 55 47 43 39 37 35 34 33 32"
set tempMem=!memcycle7zPPMdd: =^

!
for /f %%i in ("!tempMem!") do (
  set /a cycleCount+=1
  set tempMem!cycleCount!=%%i
)
call :prepareCycle
set "cycle7zPPMd="

:zipLZMA
set "cyclezipLZMA=1"
set "cyclezipLZMAx=9"
set "cyclezipLZMAt=1"
set /a "tempProc=maxThreads/cyclezipLZMAt"
set "cyclezipLZMAd=512m"
set "cyclezipLZMAw=273 256 192 128 96 64 48 32 24 16 12 8"
set "tempMem1=5378"
set /a "cycleCount=1"
call :prepareCycle
set "cyclezipLZMA="

goto :fim

:prepareCycle
for /l %%N in (1 1 %cycleCount%) DO (set "tempProc%%N=")
for /l %%N in (1 1 %cycleCount%) DO (
  if defined cycle7zBZip2 echo something
  if defined cyclezipBZip2 echo something
  if defined cyclezipDeflate64 echo something
  if defined cyclezipDeflate echo something
  if defined cyclezipPPMd set "cyclezipPPMdd=!tempCycle%%N!"
  if defined cycle7zLZMA echo something
  if defined cycle7zLZMA2 echo something
  if defined cycle7zPPMd set "cycle7zPPMdd=!tempCycle%%N!"
  if defined cyclezipLZMA echo something
  set /a "tempProc%%N=%memRem%/tempMem%%N"
  if !tempProc%%N! gtr %maxProc% set "tempProc%%N=%maxProc%"
  set /a "memSum+=tempMem%%N*tempProc%%N"
  set /a "memRem-=tempMem%%N*tempProc%%N"
  set tempProc=!tempProc%%N!
  call :prepareProc
  set /a "memRem+=tempMem%%N*tempProc%%N"
  set /a "memSum-=tempMem%%N*tempProc%%N"
)
set /a "cycleCount=0"
exit /b

:prepareProc
    set "lock=lock_%random%_"
    set /a "startCount=0, endCount=0"
    for /l %%N in (1 1 %tempProc%) DO set "endProc%%N="
    set launch=1
    if defined cycle7zBZip2 (
      for %%x IN (%cycle7zBZip2x%) DO for %%t IN (%cycle7zBZip2t%) DO for %%d IN (%cycle7zBZip2d%) DO for %%s IN (%cycle7zBZip2s%) DO (
        set "cmd=7z.exe a teste.resultado\%%xx.bzip2.%%tt.%%dd.%%ss.7z .\teste.original\* -mx=%%x -ms=%%s -m0=BZip2:d=%%d:mt=%%t"
        call :executeProc
      )
     )
    if defined cyclezipBzip2 (
      for %%x IN (%cyclezipBZip2x%) DO for %%t IN (%cyclezipBZip2t%) DO for %%d IN (%cyclezipBZip2d%) DO (
        set "cmd=7z.exe a teste.resultado\%%xx.bzip2.%%tt.%%dd.zip .\teste.original\* -mx=%%x -mm=BZip2:d=%%d -mmt=%%t"
        call :executeProc
      )
    )
    if defined cyclezipDeflate64 (
      for %%x IN (%cyclezipDeflate64x%) DO for %%t IN (%cyclezipDeflate64t%) DO for %%w IN (%cyclezipDeflate64w%) DO (
        set "cmd=7z.exe a teste.resultado\%%xx.deflate64.%%tt.%%ww.zip .\teste.original\* -mx=%%x -mm=deflate64:fb=%%w -mmt=%%t"
        call :executeProc
      )
    )
    if defined cyclezipDeflate (
      for %%x IN (%cyclezipDeflatex%) DO for %%t IN (%cyclezipDeflatet%) DO for %%w IN (%cyclezipDeflatew%) DO (
        set "cmd=7z.exe a teste.resultado\%%xx.deflate.%%tt.%%ww.zip .\teste.original\* -mx=%%x -mm=deflate:fb=%%w -mmt=%%t"
        call :executeProc
      )
    )
    if defined cyclezipPPMd (
      for %%x IN (%cyclezipPPMdx%) DO for %%t IN (%cyclezipPPMdt%) DO for %%d IN (%cyclezipPPMdd%) DO for %%w IN (%cyclezipPPMdw%) DO (
        set "cmd=7z.exe a teste.resultado\%%xx.ppmd.%%tt.%%dd.%%ww.zip .\teste.original\* -mx=%%x -mm=PPMd:mem=%%d:o=%%w -mmt=%%t"
        call :executeProc
      )
    )
    if defined cycle7zLZMA (
      for %%x IN (%cycle7zLZMAx%) DO for %%t IN (%cycle7zLZMAt%) DO for %%d IN (%cycle7zLZMAd%) DO for %%w IN (%cycle7zLZMAw%) DO for %%s IN (%cycle7zLZMAs%) DO (
        set "cmd=7z.exe a teste.resultado\%%xx.lzma.%%tt.%%dd.%%ww.%%ss.7z .\teste.original\* -mx=%%x -ms=%%s -m0=LZMA:d=%%d:fb=%%w -mmt=%%t"
        call :executeProc
      )
    )
    if defined cycle7zLZMA2 (
      for %%x IN (%cycle7zLZMA2x%) DO for %%t IN (%cycle7zLZMA2t%) DO for %%d IN (%cycle7zLZMA2d%) DO for %%w IN (%cycle7zLZMA2w%) DO for %%s IN (%cycle7zLZMA2s%) DO (
        set "cmd=7z.exe a teste.resultado\%%xx.lzma2.%%tt.%%dd.%%ww.%%ss.7z .\teste.original\* -mx=%%x -ms=%%s -m0=lzma2:d=%%d:fb=%%w -mmt=%%t"
        call :executeProc
      )
    )
    if defined cycle7zPPMd (
      for %%x IN (%cycle7zPPMdx%) DO for %%d IN (%cycle7zPPMdd%) DO for %%w IN (%cycle7zPPMdw%) DO for %%s IN (%cycle7zPPMds%) DO (
        set "cmd=7z.exe a teste.resultado\%%xx.ppmd.%%dd.%%ww.%%ss.7z .\teste.original\* -mx=%%x -m0=PPMd:mem=%%d:o=%%w -ms=%%s"
        call :executeProc
      )
    )
    if defined cyclezipLZMA (
      for %%x IN (%cyclezipLZMAx%) DO for %%t IN (%cyclezipLZMAt%) DO for %%d IN (%cyclezipLZMAd%) DO for %%w IN (%cyclezipLZMAw%) DO (
        set "cmd=7z.exe a teste.resultado\%%xx.lzma.%%tt.%%dd.%%ww.zip .\teste.original\* -mx=%%x -mm=lzma:d=%%d:fb=%%w -mmt=%%t"
        call :executeProc
      )
    )
    set "launch="
    goto :wait

:executeProc
        if !startCount! lss %tempProc%  (
          set /a "startCount+=1, nextProc=startCount"
        ) else (
          call :wait
        )
        set cmd!nextProc!=!cmd!
        echo !time! - proc!nextProc!: starting !cmd!
        2>nul del %lock%!nextProc!
        start /b /low cmd /c !cmd!>"%lock%!nextProc!"
        exit /b

:wait
          for /l %%N in (1 1 %startCount%) do (
            if not defined endProc%%N if exist "%lock%%%N" (
              echo !time! - proc%%N: finished !cmd%%N!
              if defined launch (
                set nextProc=%%N
                exit /b
              )
              set /a "endCount+=1, endProc%%N=1"
            ) 9>>"%lock%%%N"
          ) 2>nul
          if %endCount% lss %startCount% (
            rem 1>nul 2>nul ping /n 2 ::1
            goto :wait
          )
          2>nul del %lock%*
          echo ===
          echo Thats all folks!
          exit /b

:fim
echo fim
pause
exit

This sample works without errors! The part pertaining to this topic's specific question is located at :zipPPMd. I made use of %cycleCount% to set cyclezipPPMdd. It is located at :prepareCycle part. This is the line that made it work: if defined cyclezipPPMd set "cyclezipPPMdd=!tempCycle%%N!"

But this is far from over though. Some variables may make no sense right now, because it's work in progress. I have forced thread usage to 1 on all algorythms for this sample, but what I really want is to set to all of them, from 1 to 8. Then again, I still didn't figure how to check if the script can run another cycle while one other or several others are running and decide when to run them. It needs to keep track of the number of threads and memory in use at the moment to decide.

user2896127
  • 195
  • 1
  • 2
  • 7