2017-11-24 8 views
0

私は、TCP経由でXMLデータをダウンロードしているpowershellを持っています。私はすべてのデータをファイルに書き込む必要があります。レスポンスの各行は、ファイル内の新しい行に書き込まれる必要があります。以下のコードは最初の行だけを取得します。最初の数行は私が必要としないガベージデータなので、余分なreadlineを無視してください。回答が残っていない限り、どのように回答の各行を書き続けることができますか?これについて他に何も見つかりませんでした。Windows PowerShellは、行がなくなるまで行を読み込みます。

$server = "192.168.1.173" 
$port = "45678" 
$password = "password" 

while (1) { 
    $tcpConnection = New-Object System.Net.Sockets.TcpClient($server, $port) 
    $tcpStream = $tcpConnection.GetStream() 
    $reader = New-Object System.IO.StreamReader($tcpStream) 
    $writer = New-Object System.IO.StreamWriter($tcpStream) 
    $writer.AutoFlush = $true 
    if ($tcpConnection.Connected) { 
     $writer.Write("<StageDisplayLogin>"); 
     $writer.Write($password); 
     $writer.WriteLine("</StageDisplayLogin>"); 
     $ProPresenterData = $reader.ReadLine() 
     $ProPresenterData = $reader.ReadLine() 
     $ProPresenterData = $reader.ReadLine() 
     $ProPresenterData | Out-File -Encoding "UTF8" ProPresenter.xml 
     Start-Sleep -m 200 
     while ($tcpStream.DataAvailable) { 
      $ProPresenterData = $reader.ReadLine() 
      Add-content -Path ProPresenter.xml -Value "$ProPresenterData" 
     } 
    } 
    $reader.Close() 
    $writer.Close() 
    $tcpConnection.Close() 
    "Wrote file ProPresenter.xml" 
    $ProPresenterData 

    Start-Sleep -m 500 
} 

答えて

0

部分的にしか問題に答えることができません。なぜなら、1行しか得られないのは、whileループのためです。 トリガーが最初に戻るためにループが1回だけ行われます。事前にファイルの長さを決めることができれば

$file = get-content your.xml 

foreach($line in $file){ 
    $line # this would print each line , one after the other. 
} 

Alternativlyあなたがfor-loopを使用することができます:あなたは、ファイル内のすべての行をループすることができますforeachで

あなたはまず、ファイルを完全にダウンロードして別のファイルに書き込むことができますか?または、一定の間隔で追加された行で常に更新されているファイルですか?

+0

修正。データは絶えず更新されていると私は信じている。大量のデータをファイルにどのようにダウンロードできるのかよく分かりません。生のデータを返すだけのTCPリクエストです。したがって、それは実際には「ファイル」自体ではありません。 whiledataavailableがループのために機能しないのはなぜですか? –

関連する問題