批处理脚本检查数组变量始终转到ELSE语句

时间:2015-07-09 07:26:47

标签: arrays batch-file if-statement

我有一个批处理脚本,要求用户输入服务器。然后它检查它是否来自阵列,服务器需要3个密码才能登录。否则需要2个密码。我在for循环中检查这个,但总是最终转到else语句。为什么?这是代码:

@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

2 个答案:

答案 0 :(得分:1)

嗯,这很简单。您处于循环中,但在检查第一台服务器后,您正在进入ELSE案例。 所以你在第一次迭代后跳出循环。您可以输入server1来验证这一点。在这种情况下,执行IF情况。此外,GOTO :oef毫无意义。我想你想做GOTO :EOF。虽然EOF意味着 EndOfFile ,但OEF意味着什么(或者可能是OfEndFile?:D)。

要解决您的问题,您应该修改您的循环:

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

现在,如果输入位于server1和server27之间,则跳转到breakit,否则跳转到breakit2。并且不要忘记用eof替换oef。

答案 1 :(得分:0)

您不需要迭代数组元素。如果使用元素中的任何值(而不是值中包含服务器的数字下标)将服务器值定义为带有的下标的数组,那么您可以通过{{直接测试此类服务器是否存在1}}命令。我还使用一种更简单的方法来定义数组。

if defined arrayserver[%server%] ...

您甚至可以为2个和3个密码定义具有不同值的数组元素,然后使用 no @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 命令直接使用它们的值转到相应的部分!

if

有关批处理文件中阵列管理的更多信息,请参阅this post