Неожиданный следующий

310
Christopher Collins

У меня есть код, который говорит мне unexpected Next on line 131. Хотя, если я удалю это, это скажет мне это expected Next on line 131. Я просто хочу иметь возможность сканировать диапазон IP-адресов и возвращать приведенную ниже информацию при экспорте в .csv.

' NetworkFindInfo.vbs - Windows Logon Script. ' VBScript - Look up a computers info.  ' Author Chris Collins ' Version 1 - July 2018 ' ----------------------------------------------------------'   ' Define variables.  dim strInputPath, strOutputPath, strStatus dim objFSO, objTextIn, objTextOut  ' Constants for FileSystemObject Const FOR_READING = 1 Const FOR_WRITING = 2 Const FOR_APPENDING = 8  strInputPath = "E:\VBScripts\TestFolder\computerlist.txt" '- location of input strOutputPath = "E:\VBScripts\TestFolder\ComputerInfo.csv" '- location of output  'Create a Script Runtime FileSystemObject. Set objFSO = CreateObject("Scripting.FileSystemObject") set objTextIn = objFSO.OpenTextFile( strInputPath,1 )  'Step 1 - Check to see if the output file exists. If so, open it for writing or appending. 'If not, create it and open it for writing.  If objFSO.FileExists(strOutputPath) Then Set objOutputFile = objFSO.OpenTextFile (strOutputPath, FOR_WRITING) Else Set objOutputFile = objFSO.CreateTextFile(strOutputPath) End If If Err <> 0 Then Wscript.Echo "Unable to open " & strOutputPath & " for output." WScript.Quit End If  'Create Headers for Host, NIC, IP and SubNet Mask objOutputFile.Writeline "OS, Processor/System Architecure, Computer Name, Total Physical Memory, Serial/Service, Processor Name, NIC, IP Address, Computer Name, NIC, MAC Address"  Do until objTextIn.AtEndOfStream = True strComputer = objTextIn.ReadLine  'Step 3 - Collect Computer Inforamtion Set objWMIService = GetObject("winmgmts:" _ & "!\\" & strComputer & "\root\cimv2") Set colNicConfigs = objWMIService.ExecQuery("SELECT * FROM " & _ "Win32_NetworkAdapterConfiguration WHERE IPEnabled = True") ' Test for success in binding to WMI. If Err = 0 Then Set objWMIService = GetObject("winmgmts:" _ & "!\\" _ & strComputer & "\root\cimv2") Set colSettings = objWMIService.ExecQuery _ ("Select * from Win32_ComputerSystem") Set colSMBIOS = objWMIService.ExecQuery _ ("Select * from Win32_SystemEnclosure") Set colItems = objWMIService.ExecQuery(_ "Select * from Win32_Processor") Set shell = CreateObject("WScript.Shell") Set getOSVersion = shell.exec("%comspec% /c ver") version = getOSVersion.stdout.readall Select Case True Case InStr(version, "n 5.0") > 1 : GetOS = "Windows 2000" Case InStr(version, "n 5.1") > 1 : GetOS = "Windows XP" Case InStr(version, "n 5.2") > 1 : GetOS = "Windows Server 2003" Case InStr(version, "n 6.0") > 1 : GetOS = "Windows Vista" Case InStr(version, "n 6.0.6001") > 1 : GetOS = "Windows Server 2008" Case InStr(version, "n 6.1.7600") > 1 : GetOS = "Windows 7" Case InStr(version, "n 6.1.7600.16385") > 1 : GetOS = "Windows Server 2008" Case InStr(version, "n 6.1.7601") > 1 : GetOS = "Windows 7 SP1" Case InStr(version, "n 6.2") > 1 : GetOS = "Windows 8" Case InStr(version, "n 6.2.9200") > 1 : GetOS = "Windows Server 2012" Case InStr(version, "n 6.3") > 1 : GetOS = "Windows 8.1" Case InStr(version, "n 6.3.9200") > 1 : GetOS = "Windows Server 2012 R2" Case InStr(version, "n 6.3.9600") > 1 : GetOS = "Windows Server 2012 R2" Case InStr(version, "n 10.0.17134") > 1 : GetOS = "Windows 10 (1803)" Case InStr(version, "n 10.0.16299") > 1 : GetOS = "Windows 10 (1709)" Case InStr(version, "n 10.0.15063") > 1 : GetOS = "Windows 10 (1703)" Case InStr(version, "n 10.0.14393") > 1 : GetOS = "Windows 10 (1607)"  Case InStr(version, "n 10.0.10586") > 1 : GetOS = "Windows 10 (1511)" Case InStr(version, "n 10.0.10240") > 1 : GetOS = "Windows 10" Case Else : GetOS = "Unknown" End Select  'Step 4 check bitness (x64 or x86) Dim WshShell Dim WshProcEnv Dim system_architecture Dim process_architecture  Set WshShell = CreateObject("WScript.Shell") Set WshProcEnv = WshShell.Environment("Process")  process_architecture= WshProcEnv("PROCESSOR_ARCHITECTURE")   If process_architecture = "x86" Then  system_architecture= WshProcEnv("PROCESSOR_ARCHITEW6432")  If system_architecture = "" Then  system_architecture = "x86" End if  Else  system_architecture = process_architecture  End If  'Step 5 - Output Data to file objOutputFile.Write GetOS objOutputFile.Write "," & process_architecture & "-" & system_architecture For Each objComputer in colSettings  objOutputFile.Write ", " & objComputer.Name objOutputFile.Write ", " & Round(objComputer.TotalPhysicalMemory / 1073741824, 2) & "GB Usable" Next For Each objSMBIOS in colSMBIOS objOutputFile.Write ", " & objSMBIOS.SerialNumber Next For Each objItem in colItems objOutputFile.Write ", " & objItem.Name Next For Each objNicConfig In colNicConfigs For Each strIPAddress In objNicConfig.IPAddress objOutputFile.Write strComputer & ", (" & objNicConfig.Index & ") "& objNicConfig.Description & ", " & strIPAddress & ", " & strMACAddress Next Next End If loop Msgbox("Done Collecting Data") 

Обратите внимание, если я изменю это на один компьютер, у меня нет проблем. Сценарий работал отлично, пока я не добавил часть о IP.

0
Пожалуйста, сэкономьте нам время и выделите линию 131 Bill Hileman 6 лет назад 0
Это последний перед концом, если. Christopher Collins 6 лет назад 0

1 ответ на вопрос

1
Bill Hileman

Я считаю, что ваша проблема в этой строке:

If Err = 0 Then 

который, кажется, не соответствует End If

Возможно, придется идти до последнего Next

Правильный отступ вашего кода поможет вам избежать подобных проблем в будущем.

Изменить: на второй взгляд, у вас просто последний Nextи End Ifв неправильном порядке. Поменять их местами

Ваше первое предложение заставило его работать. Хотя теперь это не что-то писать в CSV, но заголовок. Диапазон IP-адресов, с которыми я работал, я знаю, что по крайней мере один компьютер включен. Christopher Collins 6 лет назад 0
Глобальное `On Error Resume Next` никогда не должно использоваться. Это делает очень трудным устранение неполадок в вашем коде. EBGreen 6 лет назад 1
Ваше право, у меня есть "удаленная машина не существует". Вот почему здесь «Ошибка возобновления следующего». Я изменил диапазон только на мой компьютер, и он отлично распечатал данные. Я хочу, чтобы он печатал данные, несмотря ни на что. Christopher Collins 6 лет назад 0
Вместо глобального `On Error Resume Next` вы должны вместо этого поставить это прямо перед любой строкой, в которой, как вы ожидаете, возможно возникнет ошибка, поставить` On Error Goto 0` после строки. Затем проверьте наличие ошибок и обработайте условие ошибки. EBGreen 6 лет назад 0
Ну, я сделал тест с моим компьютером IP (84) и следующие два (85-86). Он записывал данные моих компьютеров, но как только он достиг 85, он прекратил запись данных. Я знаю, что 86 тоже активный IP. Где бы вы посоветовали поставить «On Error Goto 0» Christopher Collins 6 лет назад 0
Удалите глобальный `On Error Resume Next`, тогда он точно скажет, в какой строке возникла проблема. EBGreen 6 лет назад 0
Это говорит мне, что сразу после шага 3, когда я начинаю `Установить objWMIService`, я поставил` On Error Goto 0` до и после, но это не исправляет. Christopher Collins 6 лет назад 0
@EBGreen вы на правильном пути, но вы не должны ставить On Error Goto 0, прежде чем проверять объект err, иначе он немедленно переопределит и сообщит об ошибке и выйдет из кода. Вместо этого вы должны проверить, если err> 0, и если да, то err.Clear и обрабатывать соответственно, ТО, тогда вы можете безопасно выполнить On Error Goto 0. Bill Hileman 6 лет назад 0
Да, прошло несколько лет с тех пор, как я регулярно делал VBScript. Спасибо за улов. EBGreen 6 лет назад 0
Хорошо, я не могу заставить его работать даже со всем этим. Нужна немного больше помощи. Christopher Collins 6 лет назад 0
Хорошо, проблема, по-видимому, возникает, когда он работает на компьютере, отличном от Windows, или ничего не привязано к IP. Christopher Collins 6 лет назад 0

Похожие вопросы