For循环中的变量保留旧值

时间:2015-05-13 18:52:55

标签: vbscript foreach wmi

我有一个程序从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

1 个答案:

答案 0 :(得分: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