这是可能非常简单的特定现实问题之一。我现在对我的旧BBS /终端代码太生疏了,不记得当前的情况。
我有一个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会话另一端的服务器指示它已准备就绪时,会出现问题。上面的实现只是使用Start-Sleep(十秒!),然后发送下一个命令'blind'。
我想要做的是,启动一个缓冲区来获取会话服务器发送到我的盒子的内容,然后根据我是否看到从该缓冲区内的终端会话返回的提示来触发下一个命令。
示例(这是来自IBM DS400 San Controller的提示,脚本的目标)
xxxxxxSANCTRLnnn [A]>
现在,这些名称将根据其位置(xxxxxx),正在访问的实际SAN(nnn)以及我正在访问的SAN(A或B)中的两个控制器模块中的哪一个而发生变化。因此,正则表达式匹配语句对于系统提示符的实际“模式匹配”非常有用。我对脚本专家的问题是,有哪些方法可以解决:
1)让脚本暂停,同时缓冲终端的输出 2)将该输出传递给日志文件 3)在预期的“提示”上进行模式匹配,然后发出下一个命令
提前致谢! :d
答案 0 :(得分:1)
怎么做......直到?
做{start-sleep -sec 1; (并刷新服务器的读数)}直到(!$ foundMore)