为何添加:testitout函数后无法获取SERVER数组变量值?
问题分析与解决方案
你的问题核心是变量定义位置错误,导致数组变量根本没被初始化,自然无法在函数里正确展开。
问题根源
看你的脚本结构:
@ECHO OFF setlocal EnableDelayedExpansion call :testitout goto:eof // 这里直接跳到脚本末尾,后面的代码完全不会执行! set "SERVER[1]=server1.oll.is.server1.com" set "SERVER[2]=server2.cyl.is.anydom.com" :testitout ...
goto:eof会立即终止当前脚本的执行流程,后面的SERVER数组定义代码根本没机会运行,所以函数里的!SERVER[%%i]!实际上是一个未定义的变量,展开后是空字符串,这就是你看到ping failure的原因。
修复步骤
- 把数组变量定义移到
call :testitout之前,确保在调用函数前变量已经被正确初始化。 - 清理ping失败提示里的错误语法,只保留正确的延迟变量引用
!SERVER[%%i]!。
修复后的完整脚本
@ECHO OFF setlocal EnableDelayedExpansion :: 先定义数组变量,再调用函数 set "SERVER[1]=server1.oll.is.server1.com" set "SERVER[2]=server2.cyl.is.anydom.com" call :testitout goto:eof :testitout FOR /L %%i IN (1,1,2) DO ( ping !SERVER[%%i]! -n 1 -4 | find /i "TTL=">nul if errorlevel 1 ( :: 只保留正确的延迟变量引用 echo ping !SERVER[%%i]! failure ) else ( for /f "tokens=*" %%f in ('Cscript %WINDIR%\\System32\\Printing_Admin_Scripts\\en-US\\Prnmngr.vbs -l -s !SERVER[%%i]!') do ( set str1=%%f if /i not "!str1:Server name=!"=="!str1!" ( set str1=!str1:Server name =! if /i not "!str1:Server name=!"=="!str1!" ( echo | set /p=" " ) else ( echo | set /p="!str1! " ) ) if /i not "!str1:Printer name=!"=="!str1!" ( set str1=!str1:Printer name =! if /i not "!str1:Printer name=!"=="!str1!" ( echo | set /p=" " ) else ( echo | set /p="!str1! " ) ) if /i not "!str1:Share name=!"=="!str1!" ( set str1=!str1:Share name =! if /i not "!str1:Share name=!"=="!str1!" ( echo | set /p=" " ) else ( echo | set /p="!str1! " ) ) if /i not "!str1:Driver name=!"=="!str1!" ( set str1=!str1:Driver name =! if /i not "!str1:Driver name=!"=="!str1!" ( echo | set /p=" " ) else ( echo | set /p="!str1! " ) ) if /i not "!str1:Port name=!"=="!str1!" ( set str1=!str1:Port name =! if /i not "!str1:Port name=!"=="!str1!" ( echo | set /p=" " ) else ( echo !str1! ) ) ) ) )
关键说明
- 延迟变量扩展
EnableDelayedExpansion是正确开启的,在FOR循环里用!变量名!来引用循环变量或数组变量是正确的语法,但前提是变量已经被定义。 goto:eof的作用是终止当前脚本/函数的执行,所以它后面的代码永远不会被执行,一定要把需要初始化的变量放在它之前。- 你之前尝试的
%!SERVER[%%i]!%和%%SERVER[%%i]%%都是错误的语法,批处理里没有这种写法,只需要用!SERVER[%%i]!就能正确展开数组元素。
现在运行修复后的脚本,当ping失败时,就会正确输出ping server1.oll.is.server1.com failure这样的预期内容了。
内容的提问来源于stack exchange,提问作者munish
相关产品推荐
相关产品推荐

