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