PowerShellでCLSや改行せずに画面を書き換えるには
PowerShellのコンソール上で何かの処理中の途中経過を表示するバー表示
■■■■■■____ 40%
を表示する方法を解説したいと思います。
環境はWindows PowerShell バージョン5.1を想定しています
結論
for($i=0;$i -le 10;$i++){
write-host "$('*'*$i)$('_'*(10-$i)) $(${i}*10)%" -noNewLine "`r"
sleep 2
}
または こう
for($i=0;$i -le 10;$i++){
write-host $(" "*$i) -NonewLine -BackgroundColor Blue
write-host $(" "*(10-$i)) -NonewLine -BackgroundColor DarkBlue
write-host " $(${i}*10)%" -NonewLine "`r"
sleep 2
}
解説
■■■■■■____ 40%
↑このような表示をする場合、普通に表示すると1行づつ下にずれてしまいます。
下が普通のコード
これは*を$i個、*を10-$i個表示しています。
for($i=0;$i -le 10;$i++){
write-host "$('*'*$i)$('_'*(10-$i)) $(${i}*10)%"
sleep 2
}
PowerShellのコンソールに張り付けて実行するとこうなります
__________ 0%
*_________ 10%
**________ 20%
***_______ 30%
****______ 40%
*****_____ 50%
******____ 60%
*******___ 70%
********__ 80%
*********_ 90%
********** 100%
上の画面のように表示するごとに改行してしまいます。
これを防ぐために
まずwrite-host の後ろに -noNewLineをつけて改行しないようにします。
次にキャリッジリターン "`r" をつけて行の先頭に戻します。
修正したのが下のコード
for($i=0;$i -le 10;$i++){
write-host "$('*'*$i)$('_'*(10-$i)) $(${i}*10)%" -noNewLine "`r"
sleep 2
}
私はこの‘rを改行の時に使う記号くらいに思っていてキャリッジリターンの意味を初めて知ったんですが
こうするとカーソルを毎回行の先頭に戻して上書きできます。
応用
応用版はこちら
色を付けてみました
for($i=0;$i -le 10;$i++){
write-host $(" "*$i) -NonewLine -BackgroundColor Blue
write-host $(" "*(10-$i)) -NonewLine -BackgroundColor DarkBlue
write-host " $(${i}*10)%" -NonewLine "`r"
sleep 2
}
キャリッジリターンの他にもエスケープシーケンスを使うと同じ事ができるらしいですね。試したんですがPowerShellのコンソール画面とLinuxとかとは違っていて上手くいきませんでした。できることは色を変える程度。もうWindows版PowerShellは開発中止されているので今後、エスケープシーケンスへの完全対応は無いでしょう。エスケープシーケンスの面白い使い方を見つけたら記事にします。
#PowerShell #キャリッジリターン #エスケープシーケンス #CLS #改行
#プログラミング学習 #プログラミング初心者 #Windows #コンソール画面