我有一个批处理脚本,要求用户输入服务器。然后它检查它是否来自阵列,服务器需要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
答案 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。