web-dev-qa-db-ja.com

コマンドライン出力の更新、つまり進行中

コマンドラインのシンプルなPHPスクリプトで進行状況メーターを表示できるようにしたいと思います。

_Progress: 0%
Progress: 1%
etc...
_

Git cloneがたとえばResolving deltas: 100% (8522/8522), done.のように、数字だけを変更して、前の数字を置き換えたいです。

これを探しているときに Perlで答えられる同じ質問 を見つけました。これは完璧ですが、PHPで見つけることができませんでした。出来ますか?そうでない場合は、Cに頼ります。

ありがとう

更新:C++バージョンに興味がある人は、 ここにあります

56
Adam

これは、ANSIエスケープシーケンス- こちらを参照 を使用して実行できます。

PHPでは、そのページでESCと示されているときに"\033"を使用します。


あなたの場合、次のようなものを使用できます。

echo "Progress :      ";  // 5 characters of padding at the end
for ($i=0 ; $i<=100 ; $i++) {
    echo "\033[5D";      // Move 5 characters backward
    echo str_pad($i, 3, ' ', STR_PAD_LEFT) . " %";    // Output is always 5 characters long
    sleep(1);           // wait for a while, so we see the animation
}


少しだけ単純化して、常に5文字の余分な文字があることを確認し、常に同じ量のデータを表示して、常に同じ文字数だけ後方に移動します...

しかし、もちろん、必要に応じて、はるかに複雑なことができるはずです;-)

また、他にも多くの興味深いエスケープシーケンスがあります。たとえば、色は出力をかなり向上させることができます;-)

101
Pascal MARTIN

古いスレッドでの記録のためだけに:凝ったANSIエスケープシーケンスを使用してカーソルを戻す代わりに、次の行「\ n」の代わりに「\ r」を使用して行頭に戻します。 。エコーの後にスペースをいくつか追加して、以前にあったものを上書きします。そう:

for ($i=0 ; $i<=100 ; $i++) {
  echo "Progress: $i %   \r";
  sleep(1);
}
53
Dom