Sub Main Dim strInputFile, strOutputFile, strInputDelim, strOutputDelim Dim lngSkip, lngToken, lngLineNo Dim objInputTS, objOutputTS, strComputer, objSystems, objSystem ? BEGIN CALLOUT A With WScript.Arguments ? BEGIN COMMENT ? Если в командной строке указан ключ /? или количество аргументов меньше 2, ? показать сообщение об использовании сценария. ? END COMMENT If.Named.Exists(«?») Then Usage If.Unnamed.Count < 2 Then Usage ? BEGIN COMMENT ? Имена входного и выходного файлов являются двумя первыми неименованными ? аргументами командной строки. ? END COMMENT strInputFile =.Unnamed(0) strOutputFile =.Unnamed(1) ? BEGIN COMMENT ? если указаны ключи /I и/или /O, первый символ используется в качестве разделителя. ? END COMMENT strInputDelim = Left(.Named(«I»), 1) If strInputDelim = «» Then strInputDelim = vbTab strOutputDelim = Left(.Named(«O»), 1) If strOutputDelim = «» Then strOutputDelim = vbTab ? BEGIN COMMENT ? Если ключ /S указывает нормальное число, используем его, иначе 0. ? END COMMENT lngSkip = GetNumber(.Named(«S»)) ? BEGIN COMMENT ? Если ключ /T указывает нормальное число, используем его, иначе 0. ? END COMMENT lngToken = GetNumber(.Named(«T»)) If lngToken = 0 Then lngToken = 1 End With ? END CALLOUT A Set g_objFSO = CreateObject(«Scripting.FileSystemObject») On Error Resume Next ? BEGIN COMMENT ? Создание объекта TextStrean для чтения входного файла. В случае ? возникновения ошибки завершить исполнение сценария. ? END COMMENT Set objInputTS = g_objFSO.OpenTextFile(strInputFile, FOR_READING) If Err Then Die «Error opening input file: « _ & Err.Description & « (0x» & Hex(Err) & «)», Err ? BEGIN COMMENT ? Если выходной файл уже существует, завершение сценария с сообщением об ошибке. ? END COMMENT If g_objFSO.FileExists(strOutputFile) Then _ Die «Output file already exists (0x» & Hex(ERROR_ALREADY_EXISTS) & «)», _ ERROR_ALREADY_EXISTS ? BEGIN COMMENT ? Создание объекта TextStrean для записи выходного файла. В случае ? возникновения ошибки завершить исполнение сценария. ? END COMMENT Set objOutputTS = g_objFSO.OpenTextFile(strOutputFile, FOR_WRITING, True) If Err Then Die «Error opening output file: « _ & Err.Description & « (0x» & Hex(Err) & «)», Err ? BEGIN COMMENT ? Игнорировать первые несколько строк входного файла, ? число пропускаемых строк определено ключом /S ? END COMMENT For lngLineNo = 1 To lngSkip: objInputTS.SkipLine: Next ? BEGIN COMMENT ? Если указан ключ /N, не записываем заголовок в файл результата. ? END COMMENT If Not WScript.Arguments.Named.Exists(«N») Then _ objOutputTS.WriteLine «Name» & strOutputDelim & «Description» _ & strOutputDelim & «OS» & strOutputDelim & «ServicePack» _ & strOutputDelim & «Error» Do While Not objInputTS.AtEndOfStream ? BEGIN CALLOUT B strComputer = GetToken(objInputTS.ReadLine, strInputDelim, lngToken) ? END CALLOUT B If Len(strComputer) > 0 Then ? BEGIN COMMENT ? Опрос удаленного компьютера командой Ping. ? END COMMENT ? BEGIN CALLOUT C If Not Alive(strComputer) Then ? END CALLOUT C objOutputTS.WriteLine strComputer & String(4, strOutputDelim) & «1» Else Set objSystems = GetObject(«WinMgmts:{impersonationlevel=impersonate}!//» _ & strComputer & «/root/CIMV2»).InstancesOf(«Win32_OperatingSystem») If Err Then ? BEGIN COMMENT ? Выдать имя компьютера и код ошибки. ? END COMMENT objOutputTS.WriteLine strComputer & String(4, strOutputDelim) & Hex(Err) Else For Each objSystem In objSystems objOutputTS.WriteLine objSystem.CSName & strOutputDelim _ & objSystem.Description & strOutputDelim _ & objSystem.Caption & strOutputDelim _ & CStr(objSystem.ServicePackMajorVersion) & strOutputDelim _ & Hex(Err) Next End If Err.Clear End If End If Loop ? BEGIN COMMENT ? Закрыть файлы. ? END COMMENT objInputTS.Close objOutputTS.Close End Sub