none
Сценарий на VBS и TELNET.EXE RRS feed

  • Вопрос

  • Доброго времени суток, уважаемые коллеги! Нужна ваша помощь.
    Появилась у меня необходимость поуправлять сетевыми принтерами через TELNET, но не вручную, а из сценария на VBS. Казалось бы всё элементарно: используй метод Exec объекта WshShell, перехватывай стандартные потоки, и получишь желаемое. Однако типовой для подобной задачи код

    Set objWShell = CreateObject("WScript.Shell")
    Set objExec = objWShell.Exec("telnet.exe /?")
    Set objOutStream = objExec.StdOut
    While Not objOutStream.AtEndOfStream
    	strOut = strOut & Trim(objOutStream.ReadLine) & vbNewLine
    Wend

    даёт в качестве значения переменной strOut пустую строку.
    В чём бы здесь могло быть дело?

    4 июля 2013 г. 11:26

Ответы

  • C# + telnet process w/ redirected standard streams quits immediately - ответ Hans Passant

    Поэтому все используют - SendKeys,сторонние библиотеки,клиенты(http://consoletelnet.sourceforge.net/,putty) и т.д

    • Помечено в качестве ответа DmitriiV 4 июля 2013 г. 12:03
    4 июля 2013 г. 11:41
    Отвечающий
  • Я поступал следующим образом: запускал telnet с ключом -f, чтобы направлять вывод telnet в лог-файл:

    strLogFile = "c:\scripts\telnet.log"
    
    Set oShell = CreateObject("WScript.Shell")
    oShell.Run "telnet.exe -f " & strLogFile & " " & strComputer
    WScript.Sleep 5000
    
    On Error Resume Next
    oShell.AppActivate "Telnet"
    
    If Err.Number<>0 Then
      WScript.Echo "Cannot start Telnet application"
      WScript.Quit
    End If
    
    On Error Goto 0
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set oLogFile = fso.OpenTextFile(strLogFile, ForReading)

    затем получал вывод после каждой команды SendKeys, вызывая функцию

    Function fnResponse()
    const t=500
    
    Dim i
    Dim strResponse
    
    i = 0
    
    Do While (i<=10) And oLogFile.AtEndOfStream
      i = i + 1
      WScript.Sleep t
    Loop
    
    If oLogFile.AtEndOfStream Then
      fnResponse = ""
      Exit Function
    Else
      strResponse = ""
      Do Until oLogFile.AtEndOfStream
        strResponse = strResponse & oLogFile.ReadAll
        WScript.Sleep t
      Loop
    End If
    fnResponse = strResponse
    End Function


    • Изменено osr_MVP, Moderator 4 июля 2013 г. 12:17 дополнение
    • Помечено в качестве ответа DmitriiV 5 июля 2013 г. 2:49
    4 июля 2013 г. 12:12
    Модератор

Все ответы

  • C# + telnet process w/ redirected standard streams quits immediately - ответ Hans Passant

    Поэтому все используют - SendKeys,сторонние библиотеки,клиенты(http://consoletelnet.sourceforge.net/,putty) и т.д

    • Помечено в качестве ответа DmitriiV 4 июля 2013 г. 12:03
    4 июля 2013 г. 11:41
    Отвечающий
  • Благодарю. Понятно.
    4 июля 2013 г. 12:04
  • Я поступал следующим образом: запускал telnet с ключом -f, чтобы направлять вывод telnet в лог-файл:

    strLogFile = "c:\scripts\telnet.log"
    
    Set oShell = CreateObject("WScript.Shell")
    oShell.Run "telnet.exe -f " & strLogFile & " " & strComputer
    WScript.Sleep 5000
    
    On Error Resume Next
    oShell.AppActivate "Telnet"
    
    If Err.Number<>0 Then
      WScript.Echo "Cannot start Telnet application"
      WScript.Quit
    End If
    
    On Error Goto 0
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set oLogFile = fso.OpenTextFile(strLogFile, ForReading)

    затем получал вывод после каждой команды SendKeys, вызывая функцию

    Function fnResponse()
    const t=500
    
    Dim i
    Dim strResponse
    
    i = 0
    
    Do While (i<=10) And oLogFile.AtEndOfStream
      i = i + 1
      WScript.Sleep t
    Loop
    
    If oLogFile.AtEndOfStream Then
      fnResponse = ""
      Exit Function
    Else
      strResponse = ""
      Do Until oLogFile.AtEndOfStream
        strResponse = strResponse & oLogFile.ReadAll
        WScript.Sleep t
      Loop
    End If
    fnResponse = strResponse
    End Function


    • Изменено osr_MVP, Moderator 4 июля 2013 г. 12:17 дополнение
    • Помечено в качестве ответа DmitriiV 5 июля 2013 г. 2:49
    4 июля 2013 г. 12:12
    Модератор
  • osr_, благодарю за совет. Я пришёл к подобному же решению.
  • в первом скрипте добавить для правильной работы 

    Const ForReading = 1
    Const ForWriting = 2

    куда-нибудь перед строкой

    Set oLogFile = fso.OpenTextFile(strLogFile, ForReading)

    а иначе возможна ошибка 

    Ошибка: Недопустимый вызов или аргумент процедуры
    Код: 800A0005
    Источник: Ошибка выполнения Microsoft VBScript

    возникает она не у всех 

    Для совместимости на других системах где константы сконфигурированны для запрета записи и чтения от WSH

     

    24 октября 2013 г. 22:22
  • Да, согласен, причем в исходном скрипте эти константы есть. Я просто выдирал куски из готового скрипта, чтобы проиллюстрировать вариант решения.
    25 октября 2013 г. 6:58
    Модератор