У меня есть код, который говорит мне 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.
Пожалуйста, сэкономьте нам время и выделите линию 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