Ich habe einen Code, der mir sagt unexpected Next on line 131. Wenn ich das aber lösche, sagt es mir expected Next on line 131. Ich möchte nur in der Lage sein, einen IP-Adressbereich zu scannen und die unten stehenden Informationen zurückzugeben, während ich ihn in eine CSV-Datei exportiere.
' 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")
Wenn ich dies auf einen einzelnen Computer ändere, habe ich keine Probleme. Das Skript lief großartig, bis ich den Teil über IPs hinzugefügt habe.
Bitte sparen Sie uns etwas Zeit und markieren Sie, welche Zeile Zeile 131 ist
Bill Hileman vor 6 Jahren
0
Es ist die letzte vor dem Ende.
Christopher Collins vor 6 Jahren
0
1 Antwort auf die Frage
1
Bill Hileman
Ich glaube, dein Problem ist diese Zeile:
If Err = 0 Then
das scheint keine Übereinstimmung zu haben End If
Möglicherweise muss es vor dem letzten gehen Next
Wenn Sie Ihren Code richtig einrücken, können Sie solche Probleme in Zukunft vermeiden.
Edit: Auf den zweiten Blick haben Sie nur die letzte Nextund End Ifin der falschen Reihenfolge. Umkehren Sie sie.
Ihr erster Vorschlag hat es funktioniert. Jetzt schreibt es jedoch nichts an die CSV, sondern an den Header. Der IP-Bereich, den ich lief, weiß ich, dass mindestens ein Computer eingeschaltet ist.
Christopher Collins vor 6 Jahren
0
Global 'On Error Resume Next' sollte niemals verwendet werden. Dies macht es sehr schwierig, den Code zu behandeln.
EBGreen vor 6 Jahren
1
Dein Recht, ich habe eine "entfernte Maschine existiert nicht". Deshalb gibt es den 'Error Resume Next'. Ich habe den Bereich auf nur meinen Computer geändert und die Daten wurden gut gedruckt. Ich möchte, dass die Daten trotzdem gedruckt werden.
Christopher Collins vor 6 Jahren
0
Anstelle eines globalen `On Error Resume Next` sollten Sie stattdessen vor jeder Zeile, die einen Fehler erwartet, das Zeichen 'On Error Goto 0` nach der Zeile setzen. Überprüfen Sie dann auf Fehler und behandeln Sie den Fehlerzustand.
EBGreen vor 6 Jahren
0
Nun, ich habe einen Test mit meinem Computer IP (84) und den Next zwei (85-86) durchgeführt. Er schrieb die Daten meines Computers, aber sobald er 85 erreichte, hörte er auf, Daten zu schreiben. Ich weiß, dass 86 auch eine aktive IP ist. Wo würdest du vorschlagen, dass ich den 'On Error Goto 0' setze?
Christopher Collins vor 6 Jahren
0
Entfernen Sie die globale Option "On Error Resume Next" und sagen Sie genau, in welcher Zeile das Problem aufgetreten ist.
EBGreen vor 6 Jahren
0
Es sagt mir, dass es gleich nach Schritt 3 ist, wenn ich mit `Set objWMIService` beginne. Ich habe das` On Error Goto 0` vor und nach gesetzt, aber es wird nicht behoben.
Christopher Collins vor 6 Jahren
0
@EBGreen ist auf dem richtigen Weg, aber Sie sollten den On Error Goto 0 nicht setzen, bevor Sie das Err-Objekt überprüfen. Andernfalls wird der Fehler sofort überschrieben, der Fehler wird gemeldet und der Code wird beendet. Stattdessen sollten Sie prüfen, ob err> 0 ist, und wenn dies der Fall ist, dann err.Clear und entsprechend behandeln. DANN können Sie einen On Error-Sprung 0 sicher ausführen.
Bill Hileman vor 6 Jahren
0
Ja, seit vielen Jahren habe ich regelmäßig VBScript gemacht. Danke für den Haken.
EBGreen vor 6 Jahren
0
Ok, ich kann es trotz all dem nicht schaffen. Benötigen Sie etwas mehr Hilfe.
Christopher Collins vor 6 Jahren
0
Das Problem, das es zu haben scheint, ist, wenn es auf einem Nicht-Windows-Rechner läuft oder wenn nichts mit der IP verbunden ist.
Christopher Collins vor 6 Jahren
0