• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 432
  • Last Modified:

How to get right value in loop in DOS shell script

Would like to get the right value in this script:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set N=10
set var=A
for /l %%i in (1,1,%N% ) do (
  @echo %var%
  if %%i lss 3 (
    set %var%=B
  ) else (
   if %%i lss 6 (
     set %var%=C
   ) else (
     set %var%=D
   )
  )
)

Expecting the output as follows
A
B
C
C
C
D
D
D
D
D
Actually not. Can any gurus help me out?
0
jl66
Asked:
jl66
  • 11
  • 2
  • 2
  • +1
3 Solutions
 
paultomasiCommented:
Providing you do have to set a variable to you values, A, B, C, D, then this will do it quite nicely.
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set N=10

for /l %%i in (1,1,%N%) do (
  if %%i lss 6 (
    if %%i lss 3 (
      if %%i lss 2 (
        set var=A
      ) else (
        set var=B
      )
    ) else (
      set var=C
    )
  ) else (
    set var=D
  )
  echo !var!
)

Open in new window

0
 
paultomasiCommented:
If you want to pre-set var to A and place ECHO at the start of the loop then you will need this:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set N=10
set var=A

for /l %%i in (1,1,%N%) do (
  echo !var!
  if %%i lss 5 (
    if %%i lss 2 (
      set var=B
    ) else (
      set var=C
    )
  ) else (
    set var=D
  )
)
exit /b

Open in new window

0
 
paultomasiCommented:
Are you sure you want:

    A B CCC DDDDD

instead of:

    A BB CCC DDDD

?
0
 [eBook] Windows Nano Server

Download this FREE eBook and learn all you need to get started with Windows Nano Server, including deployment options, remote management
and troubleshooting tips and tricks

 
paultomasiCommented:
Similarly, you could place the ECHO at the end of the loop (as in the first program above) and pre-set var to A like this:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set N=10
set var=A

for /l %%i in (1,1,%N%) do (
  if %%i lss 6 (
    if %%i lss 3 (
      if %%i gtr 1 (
        set var=B
      )
    ) else (
      set var=C
    )
  ) else (
    set var=D
  )
  echo !var!
)

Open in new window

0
 
paultomasiCommented:
Here are two other methods (pre-processing and post-processing var):
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set N=10
set var=A

for /l %%i in (1,1,%N%) do (
  echo !var!
  if %%i equ 1 set var=B
  if %%i equ 2 set var=C
  if %%i equ 5 set var=D
)

Open in new window

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set N=10
set var=A

for /l %%i in (1,1,%N%) do (
  if %%i equ 2 set var=B
  if %%i equ 3 set var=C
  if %%i equ 6 set var=D
  echo !var!
)

Open in new window

0
 
paultomasiCommented:
This is another way you can do it:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set N=9
set var=ABCCCDDDDD

for /l %%i in (0,1,%N%) do (
  echo !var:~%%i,1!
)

Open in new window

0
 
paultomasiCommented:
Finally, here's the shortest way of doing it:
@for %%i in (A B C C C D D D D D) do @echo %%i

Open in new window

Yep! Just a one-liner!

Or like this:
@echo off
set var=A B C C C D D D D D

for %%i in (%var%) do echo %%i

Open in new window

0
 
paultomasiCommented:
YOUR ORIGINAL CODE. See the necessary changes below:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set N=10
set var=A

for /l %%i in (1,1,%N% ) do (
  echo !var!
  if %%i lss 2 (
    set var=B
  ) else (
   if %%i lss 5 (
     set var=C
   ) else (
     set var=D
   )
  )
)

Open in new window

0
 
QlemoC++ DeveloperCommented:
There is an obvious difference between
   set %var%=b
and
   set var=b

What Paul showed in all length above appears to be what you were really after, because the original way of setting would set the var named like the contents of %var% to be set. Example:
@echo on
setlocal EnableDelayedExpansion
set var=A
set A=1
set %var%=2
echo %var%, !%var%!

Open in new window

0
 
Gerwin Jansen, EE MVETopic Advisor Commented:
Hi, I would just correct your script like this:

echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set N=10
set var=A
for /l %%i in (1,1,%N% ) do (
  @echo !var!
  if %%i lss 3 (
    set var=B
  ) else (
   if %%i lss 6 (
     set var=C
   ) else (
     set var=D
   )
  )
)

Open in new window


Output is:

A
B
B
C
C
C
D
D
D
D
0
 
paultomasiCommented:
gerwinjansen

I think it was more challenging doing "A B CCC DDDD" which now leads me to think this may have in fact been a classroom exercise.

jl66 specified the following output:

    A
    B
    C
    C
    C
    D
    D
    D
    D
    D

I queried this in http:#37790053 however, there has been no feedback suggesting otherwise.
0
 
jl66Author Commented:
Thanks a lot for everyone. Paul really made a big effort. Qlemo points out the key: I forgot the expression of the variable in loop: !xxx!.
No, this is not a classroom homework!
0
 
paultomasiCommented:
jl66

It wouldn't have mattered even if it were a classroom exercise because you had done nearly all the work yourself anyway.

Qlemo did well to point out your wrong use of 'set %var%=value'.

Of course, the other problem relates to using '%var%' instead of '!var!' however, this was not explicitly pointed out to you - you likely gathered this looking at solutions. Apologies for not pointing out these two obvious issues from the onset.
0
 
Gerwin Jansen, EE MVETopic Advisor Commented:
@paul, when looking at the original code, the output specified by OP is wrong, imho, my output is right :-) Anyway, OP learned some here...
0
 
paultomasiCommented:
gerwinjansen
You're probably right. Maybe I was reading more into the question than there really was.

jl66
Perhapss you would like to confirm which output you intended; column 1 or column 2:
           Column 1       Column 2

               A             A
               B             B
               C             B
               C             C
               C             C
               D             C
               D             D
               D             D
               D             D
               D             D

Open in new window

0
 
jl66Author Commented:
Not compromise anything. Both are right. The point is that as mentioned before I forgot !var! in loop. Thank all of you so much.
0

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 11
  • 2
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now