paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

powershellのループいろいろ

仕事でteratermマクロを定期ループさせて機器のステータスを取る用事があったのですが、最近よく使うpowershellから起動してみることにしました。

powershellはループ方法が多いので書いておきます。

環境

最近また急にハングするようになった調子悪いメイン機Windowsです。

  • OS
PS C:\Users\tsuru> Get-WmiObject Win32_OperatingSystem


SystemDirectory : C:\WINDOWS\system32
Organization    :
BuildNumber     : 19042
RegisteredUser  :
SerialNumber    : 00326-10000-00000-AA530
Version         : 10.0.19042
PS C:\Users\tsuru> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.19041.1237
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.1237
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

今回はループ処理の確認なのでマクロ起動文は割愛してdateコマンドを10回繰り返す、というスクリプトを書きます。
簡単なのでワンライナーで書いちゃいます。

while

shellでもよく使います。条件式を満たすまでですね。

PS C:\Users\tsuru> $a=1 ; while ( $a -le 10 ) { date ; sleep 1 ; $a++ }

2021923日 11:51:19
2021923日 11:51:20
2021923日 11:51:21
2021923日 11:51:23
2021923日 11:51:24
2021923日 11:51:25
2021923日 11:51:26
2021923日 11:51:27
2021923日 11:51:28

for

こちらもよく使います。カウンタの加算など、条件式の書き方がシンプルですね。

PS C:\Users\tsuru> for ( $a=1; $a -le 10; $a++ ) { date ; sleep 1 }

2021923日 11:54:49
2021923日 11:54:50
2021923日 11:54:51
2021923日 11:54:52
2021923日 11:54:53
2021923日 11:54:54
2021923日 11:54:55
2021923日 11:54:56
2021923日 11:54:57
2021923日 11:54:58

foreach

リスト系の展開によく使ってます。
反復項目をあらかじめメモリに格納するそうです。知らなかった。

PS C:\Users\tsuru> foreach ( $a in 1..10 ) { date ; sleep 1 }

2021923日 11:55:25
2021923日 11:55:26
2021923日 11:55:27
2021923日 11:55:28
2021923日 11:55:29
2021923日 11:55:30
2021923日 11:55:31
2021923日 11:55:32
2021923日 11:55:33
2021923日 11:55:34

do

最初に処理を書いて後で条件式を書くという珍しめ?な形です。
最後の条件式にwhile(trueの間), until(falseの間)が指定出来るようです。

  • while
PS C:\Users\tsuru> $a=1 ; do { date ; sleep 1 ; $a++ } while ( $a -le 10 )

2021923日 11:56:03
2021923日 11:56:04
2021923日 11:56:05
2021923日 11:56:06
2021923日 11:56:07
2021923日 11:56:08
2021923日 11:56:09
2021923日 11:56:10
2021923日 11:56:11
2021923日 11:56:12
  • until

falseの間10回繰り返したいので11以上になったら停止です。 あまりfalseの間、という処理を書いたことが無いですね。

PS C:\Users\tsuru> $a=1 ; do { date ; sleep 1 ; $a++ } until ( $a -gt 10 )

2021923日 11:57:01
2021923日 11:57:02
2021923日 11:57:03
2021923日 11:57:04
2021923日 11:57:05
2021923日 11:57:06
2021923日 11:57:07
2021923日 11:57:08
2021923日 11:57:09
2021923日 11:57:10

本題 無限ループを回す

powershellでもシンプルにwhile trueでできました。
$trueと書かないと真偽値として扱われないのですこーしはまりました。

PS C:\Users\tsuru> while ($true) { date ; sleep 1 }

2021923日 11:57:53
2021923日 11:57:54
2021923日 11:57:55
2021923日 11:57:56
2021923日 11:57:57
2021923日 11:57:58
2021923日 11:57:59
2021923日 11:58:00
2021923日 11:58:01
2021923日 11:58:02
2021923日 11:58:03
2021923日 11:58:04
2021923日 11:58:05
2021923日 11:58:06
2021923日 11:58:07
2021923日 11:58:08
2021923日 11:58:09
2021923日 11:58:10
PS C:\Users\tsuru>

Ctrl-cで停止です。

まとめ

簡単ですがpowershellのループまとめです。

コマンドプロンプトのループよりほんの少し分かりやすいのでこちらの方が好みです。
ループを覚えておくと反復処理の小技が出来ますのでpowershellでも押さえておきたいですね。

参考サイト

フロー制御 - PowerShell | Microsoft Docs