見出し画像

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 #コンソール画面


いいなと思ったら応援しよう!