You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何添加: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的原因。

修复步骤

  1. 把数组变量定义移到call :testitout之前,确保在调用函数前变量已经被正确初始化。
  2. 清理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:59:55