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