【问题标题】:Variable in For Loop Retains Old ValueFor 循环中的变量保留旧值
【发布时间】:2015-05-13 18:52:54
【问题描述】:

我有一个程序可以从 txt 文件中读取主机名,它会扫描网络以查找主机名,然后显示主机名及其各自的 Windows 操作系统 (CAPTION)。

我正在尝试将所有 Windows XP 计算机升级到 Windows 7。我正在尝试运行此列表以了解我已升级多少台计算机以及我还需要升级多少台等.

问题是,当我使用语句On Error Resume Next 时,如果脚本尝试联系一个错误的主机名,或者如果主机名是 DOWN,它会从最后一个主机名显示操作系统。然后向前扫描的每个名称都显示相同的操作系统。

什么可能导致这个错误?

On Error Resume Next

const ForReading = 1

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile= objFSO.OpenTextFile _
    ("C:\users\bh\desktop\hostnames.txt", ForReading)

strText = objTextFile.ReadAll
objTextFile.close

arrComputers = Split(strText, vbCrlf)

for Each strComputer in arrComputers
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

    Set colSettings = objWMIService.ExecQuery _
        ("Select * from Win32_OperatingSystem")

    For Each objOperatingSystem in colSettings 
        Wscript.Echo strComputer & ": " & objOperatingSystem.Caption
    Next
Next

【问题讨论】:

    标签: vbscript foreach wmi


    【解决方案1】:

    使用全局On Error Resume Next 只是要求灾难 - 所有错误都将被忽略,分配不会按您的预期完成,stale data 将被使用。

    这个:

    Dim aErr
    
    arrComputers = Split(". winxpsp3 nix")
    
    for Each strComputer in arrComputers
      On Error Resume Next
       Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
       aErr = Array(Err.Number, Err.Description)
      On Error Goto 0
       If 0 = aErr(0) Then
          Set colSettings = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
          For Each objOperatingSystem in colSettings
              Wscript.Echo strComputer & ": " & objOperatingSystem.Caption
          Next
      Else
        WScript.Echo "can't reach", strComputer, "error:", Join(aErr)
      End If
    Next
    

    输出:

    cscript 30223065.vbs
    .: Microsoft Windows XP Professional
    winxpsp3: Microsoft Windows XP Professional
    can't reach nix error: 462 The remote server machine does not exist or is unavailable
    

    为您的第一个风险任务演示严格的本地错误处理(在 OERN 和 OEG0 之间最多进行一次风险操作)。您必须相应地保护/包装其他人或检查返回值。

    (请参阅this 了解全局错误处理策略)

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 2016-01-16
      • 2022-09-27
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      相关资源
      最近更新 更多