2017-05-23 20 views
0

Windows用にコンパイルした外部exeファイルmsdl.exe(a multi-protocol downloader for various streaming protocols)を呼び出すスクリプトがあります。Write-Progress機能を再作成する

このようなルックスをダウンロードしながらそれは出力です:

download [ MechHand-1.wmv ] 
Host: [ 132.68.3.150:554 ] connected! 
Host: [ 132.68.3.150:554 ] connected! 
Speed: 2.000 
DL: 815061/313870475 B -- 0%   150.2K/s  # this line updates 

私はスクリプトからexeファイルを呼び出すために使用する行は次のとおりです。

cmd /c .\msdl.exe -s2 $address -o $filename '2>&1' 

私はへのexeファイルにスクリプトをまとめましたクライアントコンピュータで実行します。 そのようexeファイルとして実行している場合、しかし、進捗ライン自体を上書きしません、代わりにそれは、毎回新しいラインです:私は、私は必要だと思う何

download [ MechHand-1.wmv ] 
Host: [ 132.68.3.150:554 ] connected! 
Host: [ 132.68.3.150:554 ] connected! 
Speed: 2.000 

DL: 82992/313870475 B -- 0%       0B/s 
DL: 158076/313870475 B -- 0%       158.1K/s 
DL: 233160/313870475 B -- 0%       158.1K/s 
DL: 301987/313870475 B -- 0%       143.9K/s 
DL: 377071/313870475 B -- 0%       143.9K/s 

がパイプにMSDLを実行するコマンドの出力です.exeをforeachループに追加し、その内容に基づいて定期的に(download [filename]という行のように)印刷するか、前の行を上書きします。

出力をパイプすると、ファイルサイズに基づいて長い時間がかかる可能性があるので、出力を表示するのではなく、一度にすべての進捗状況を表示しますそれが生成されています。

これは機能しますか、または希望の動作をどのように複製できますか?

PS:stderrにリダイレクトするのはMSDLがstderrに書き込むためです。スクリプトを実行するときには問題ありませんが、exeを実行すると、各行は赤で印刷され、接頭辞は 'ERROR:'になります。

答えて

1

まず、cmdへの呼び出しをドロップして、PowerShellで実行するだけですか?次に、出力をForEach-Objectループにパイプし、出力があるたびにホストをクリアし、表示したいものだけを表示します。たとえば、最初の5行をバナー変数として保存することができます。次に、バナーと出力行を表示することができます。

& .\msdl.exe -s2 $address -o $filename | ForEach-Object {$i=0} { 
    Clear-Host 
    $Banner 
    if ($i -le 5) { 
     $Banner += $_ 
    } 
    $_ 
    $i++ 
} 
+0

これが望ましい動作をするかどうか試してみるつもりです、ありがとうございます。 バナーに関して - 複数のファイルをダウンロードする場合、ファイルが完成するとバナー行が返される可能性があります。入ってくる回線の内容を「切り替える」方法がありますか(たとえば「DL」で始まります)、それを追加しますか? –

+0

'&'経由の呼び出しでもpowershellで例外が出力され、 'cmd'で呼び出すとよりクリーンな出力が得られました。これは望ましい動作を与えることに近いと思われます、ありがとう。 –

関連する問題