3

これは、おそらく非常に簡単に実行できる特定の現実の問題の1つです。古いBBS/ターミナルコードがさびすぎて、現時点でどのようになっているのか思い出せません。

リモートサーバーへのTelnetセッションを開き、テキストファイルに基づいてそのサーバーにコマンドを発行するPowershellスクリプトがあります。また、サーバーから戻ってくるすべてのテキストをログに吐き出すように設計されています。

    ## 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(10秒!)を使用してから、次のコマンド「blind」を送信します。

私がやりたいのは、セッションサーバーがボックスに送信しているものを取得するためにバッファーを開始し、そのバッファー内のターミナルセッションから戻ってくるプロンプトが表示されたかどうかに基づいて次のコマンドをトリガーすることです。

例(これは、スクリプトのターゲットであるIBM DS400 San Controllerからのプロンプトです)

xxxxxxSANCTRLnnn [A]>

これで、これらの名前は、場所(xxxxxx)、アクセスされている実際のSAN(nnn)、およびSAN内の2つのコントローラーモジュール(AまたはB)のどちらにアクセスしているかに基づいて変更されます。したがって、regex -matchステートメントは、システムプロンプトの実際の「パターンマッチング」に最適です。Scripting Guyへの私の質問は、どのような方法が機能するかということです。

1)端末からの出力をバッファリングしている間スクリプトを一時停止します2)その出力をログファイルに渡します3)期待される「プロンプト」でパターンマッチングを行い、次のコマンドを発行します

前もって感謝します!:D

4

1 に答える 1

1

どうする...まで?

{開始-スリープ-秒 1; を実行します。(そしてサーバーからの読み取りを更新します)} (!$foundMore) まで

于 2012-12-25T15:51:22.303 に答える