这是可能很容易做到的那些特定的现实世界问题之一。我对我的旧 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 控制器的提示,脚本的目标)
xxxxxxSANCTRLnnn[A]>
现在,它们的名称将根据它们的位置 (xxxxxx)、正在访问的实际 SAN (nnn) 以及我正在访问的 SAN 中的两个控制器模块(A 或 B)中的哪一个而改变。因此,regex -match 语句对于系统提示的实际“模式匹配”非常有用。我对脚本专家的问题是,哪些方法可以:
1)让脚本在缓冲来自终端的输出时暂停 2)将该输出传递到日志文件 3)在预期的“提示”上进行模式匹配,然后发出下一个命令
提前致谢!:D