0

I have a batch script which asks the user to input a server. Then it checks if it is from an array, where the servers require 3 password to login. Otherwise 2 passwords are needed. I check this in a for loop but always end up going to the else statement. Why? Here is the code:

@echo off
set  arrayserver[0]=server1
set  arrayserver[1]=server2
set  arrayserver[2]=server3
set  arrayserver[3]=server4
set  arrayserver[4]=server5
set  arrayserver[5]=server6
set  arrayserver[6]=server7
set  arrayserver[7]=server8
set  arrayserver[8]=server9
set  arrayserver[9]=server10
set arrayserver[10]=server11
set arrayserver[11]=server12
set arrayserver[12]=server13
set arrayserver[13]=server14
set arrayserver[14]=server15
set arrayserver[15]=server16
set arrayserver[16]=server17
set arrayserver[17]=server18
set arrayserver[18]=server19
set arrayserver[19]=server20
set arrayserver[20]=server21
set arrayserver[21]=server22
set arrayserver[22]=server23
set arrayserver[23]=server24
set arrayserver[24]=server25
set arrayserver[25]=server26
set arrayserver[26]=server27
set user2=user2
set user3=user3
set i=0
set /p server=Enter server: 
for /F "tokens=2 delims==" %%s in ('set arrayserver[') do (
if "%server%" == "%%s" (
    goto breakit
) else (
    goto breakit2
))

:breakit
echo You will be prompted for 3 passwords:
echo -pass1
echo -pass2
echo -Oracle user
echo ssh -t -A %user2%@hop2 ssh -t -A %EDSUSER%@%server% su - oracle > C:\Temp\linkche.txt
"C:\Program Files (x86)\Putty\putty.exe" -ssh -A -t %USER%@hop1 -m C:\Temp\linkche.txt
del C:\Temp\linkche.txt
goto :oef

:breakit2
echo You will be prompted for 2 passwords:
echo -pass1
echo -Oracle user
echo ssh -t -A %user2%@hop2 ssh -A oracle@%server% > C:\Temp\linkche.txt
"C:\Program Files (x86)\Putty\putty.exe" -ssh -A -t %USER%@hop1 -m C:\Temp\linkche.txt
del C:\Temp\linkche.txt
goto :oef
XerX
  • 51
  • 6

2 Answers2

1

Well, that's simple. You are in a loop but after checking the first server you are entering the ELSE case. So you are jumping out of the loop after the first iteration. You can verify this by entering server1. In this case the IF case is executed. Further, GOTO :oef makes no sense. I suppose you want to do GOTO :EOF. While EOF means EndOfFile, OEF means nothing (or possibly OfEndFile? :D).

To fix your problem you should modify your loop like this:

...
for /F "tokens=2 delims==" %%s in ('set arrayserver[') do (
    if "%server%" == "%%s" (
        goto breakit
    )
)
goto breakit2
...

Now you will jump to breakit if the input is between server1 and server27 or to breakit2 otherwise. And don't forget to replace oef with eof.

MichaelS
  • 5,941
  • 6
  • 31
  • 46
  • It is :eof, of course :D Thanks for the answer. I was stuck with a wrong logic behind my script. – XerX Jul 09 '15 at 08:23
0

You do not need to iterate over the array elements. If you define the array with the server values as subscripts with any value in the element (instead of numeric subscripts with the server in the value), then you may directly test if such server exist via a if defined arrayserver[%server%] ... command. I also use a simpler way to define the array.

@echo off

rem Define the server array with the server *in the subscript*; the assigned value does NOT matter
for %%a in (server1  server2  server3  server4  server5  server6  server7  server8  server9  server10
            server11 server12 server13 server14 server15 server16 server17 server18 server19 server20
            server21 server22 server23 server24 server25 server26 server27) do (
   set  arrayserver[%%a]=3
)

set user2=user2
set user3=user3
set /p server=Enter server: 

if not defined arrayserver[%server%] goto passwords-2

:passwords-3
echo You will be prompted for 3 passwords:
echo -pass1
echo -pass2
echo -Oracle user
echo ssh -t -A %user2%@hop2 ssh -t -A %EDSUSER%@%server% su - oracle > C:\Temp\linkche.txt
"C:\Program Files (x86)\Putty\putty.exe" -ssh -A -t %USER%@hop1 -m C:\Temp\linkche.txt
del C:\Temp\linkche.txt
goto :eof

:passwords-2
echo You will be prompted for 2 passwords:
echo -pass1
echo -Oracle user
echo ssh -t -A %user2%@hop2 ssh -A oracle@%server% > C:\Temp\linkche.txt
"C:\Program Files (x86)\Putty\putty.exe" -ssh -A -t %USER%@hop1 -m C:\Temp\linkche.txt
del C:\Temp\linkche.txt
goto :eof

You may even define array elements with different values for 2 and 3 passwords, and then directly use their values to go to the appropriate section with no if command!

setlocal EnableDelayedExpansion

rem Servers with 3 passwords:
for %%a in (server1 server2 server27) do set arrayserver[%%a]=3

rem Servers with 2 passwords:
for %%a in (serverA serverB serverZ) do set arrayserver[%%a]=2

set /p server=Enter server: 
goto passwords-!arrayserver[%server%]!

For further info about array management in Batch files, see this post.

Community
  • 1
  • 1
Aacini
  • 65,180
  • 12
  • 72
  • 108