2012-12-14 40 views
3

这是可能非常简单的那些特定实际问题之一。我在旧的BBS /终端代码上生锈得太过头了,现在还记不记得。Powershell:收听Telnet响应文本

我有一个Powershell脚本,它打开远程服务器的Telnet会话,然后根据文本文件向该服务器发出命令。它也被设计为将从服务器返回的所有文本吐在日志中。

## Read output from a remote host 
    function GetRemoteOutput 
    { 
     ## Create a buffer to receive the response 
     $buffer = new-object System.Byte[] 1024 
     $encoding = new-object System.Text.AsciiEncoding 

     $outputBuffer = "" 
     $foundMore = $false 

     ## Read all the data available from the stream, writing it to the 
     ## output buffer when done. 
     do 
     { 
     ## Allow data to buffer for a bit 
     start-sleep -m 10000 

     ## Read what data is available 
     $foundmore = $false 
     $stream.ReadTimeout = 12000 

     do 
     { 
      try 
      { 
      $read = $stream.Read($buffer, 0, 1024) 

      if($read -gt 0) 
      { 
       $foundmore = $true 
       $outputBuffer += ($encoding.GetString($buffer, 0, $read)) 
       write-host $outputbuffer 
      } 
      } catch { $foundMore = $false; $read = 0 } 
     } while($read -gt 0) 
     } while($foundmore) 

     $outputBuffer 
    } 

的问题出现时,我有在Telnet会话的另一端等待服务器,以表明它已准备就绪。上面的实现只是使用开始 - 睡眠(十秒!),然后发送下一个命令'盲'。

我想要做的是启动一个缓冲区来获取会话服务器发送到我的盒子的内容,然后根据是否看到从该缓冲区内的终端会话返回的提示,触发下一个命令。

实施例(这是从IBM DS400圣控制器,脚本的目标的提示)

xxxxxxSANCTRLnnn [A]>现在

,这些名称将更改基于它们的位置(XXXXXX ),正在访问的实际SAN(nnn)以及我正在访问的SAN(A或B)中的两个控制器模块中的哪一个。因此,正则表达式匹配语句对于系统提示符的实际“模式匹配”非常有用。我的脚本专家的问题是,用什么方法将努力:

1)拿到剧本暂停,而它从终端 2缓冲输出),其输出传递到日志文件 3)模式匹配的预计“提示”,然后发出下一个命令

在此先感谢! :D

+0

我要找要使用的提示匹配的正则表达式是: '$ promptmatch =“^ \ W {6} SANCTRL \ d {3} \ [[A,B] \] \>“' –

回答

1

怎么样......直到?

do {start-sleep -sec 1; (并刷新从服务器读取)},直至($ foundMore!)

+0

这可能是一种可能性。我会调查它!谢谢。 –