仕事で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++ } 2021年9月23日 11:51:19 2021年9月23日 11:51:20 2021年9月23日 11:51:21 2021年9月23日 11:51:23 2021年9月23日 11:51:24 2021年9月23日 11:51:25 2021年9月23日 11:51:26 2021年9月23日 11:51:27 2021年9月23日 11:51:28
for
こちらもよく使います。カウンタの加算など、条件式の書き方がシンプルですね。
PS C:\Users\tsuru> for ( $a=1; $a -le 10; $a++ ) { date ; sleep 1 } 2021年9月23日 11:54:49 2021年9月23日 11:54:50 2021年9月23日 11:54:51 2021年9月23日 11:54:52 2021年9月23日 11:54:53 2021年9月23日 11:54:54 2021年9月23日 11:54:55 2021年9月23日 11:54:56 2021年9月23日 11:54:57 2021年9月23日 11:54:58
foreach
リスト系の展開によく使ってます。
反復項目をあらかじめメモリに格納するそうです。知らなかった。
PS C:\Users\tsuru> foreach ( $a in 1..10 ) { date ; sleep 1 } 2021年9月23日 11:55:25 2021年9月23日 11:55:26 2021年9月23日 11:55:27 2021年9月23日 11:55:28 2021年9月23日 11:55:29 2021年9月23日 11:55:30 2021年9月23日 11:55:31 2021年9月23日 11:55:32 2021年9月23日 11:55:33 2021年9月23日 11:55:34
do
最初に処理を書いて後で条件式を書くという珍しめ?な形です。
最後の条件式にwhile(trueの間), until(falseの間)が指定出来るようです。
- while
PS C:\Users\tsuru> $a=1 ; do { date ; sleep 1 ; $a++ } while ( $a -le 10 ) 2021年9月23日 11:56:03 2021年9月23日 11:56:04 2021年9月23日 11:56:05 2021年9月23日 11:56:06 2021年9月23日 11:56:07 2021年9月23日 11:56:08 2021年9月23日 11:56:09 2021年9月23日 11:56:10 2021年9月23日 11:56:11 2021年9月23日 11:56:12
- until
falseの間10回繰り返したいので11以上になったら停止です。 あまりfalseの間、という処理を書いたことが無いですね。
PS C:\Users\tsuru> $a=1 ; do { date ; sleep 1 ; $a++ } until ( $a -gt 10 ) 2021年9月23日 11:57:01 2021年9月23日 11:57:02 2021年9月23日 11:57:03 2021年9月23日 11:57:04 2021年9月23日 11:57:05 2021年9月23日 11:57:06 2021年9月23日 11:57:07 2021年9月23日 11:57:08 2021年9月23日 11:57:09 2021年9月23日 11:57:10
本題 無限ループを回す
powershellでもシンプルにwhile trueでできました。
$trueと書かないと真偽値として扱われないのですこーしはまりました。
PS C:\Users\tsuru> while ($true) { date ; sleep 1 } 2021年9月23日 11:57:53 2021年9月23日 11:57:54 2021年9月23日 11:57:55 2021年9月23日 11:57:56 2021年9月23日 11:57:57 2021年9月23日 11:57:58 2021年9月23日 11:57:59 2021年9月23日 11:58:00 2021年9月23日 11:58:01 2021年9月23日 11:58:02 2021年9月23日 11:58:03 2021年9月23日 11:58:04 2021年9月23日 11:58:05 2021年9月23日 11:58:06 2021年9月23日 11:58:07 2021年9月23日 11:58:08 2021年9月23日 11:58:09 2021年9月23日 11:58:10 PS C:\Users\tsuru>
Ctrl-cで停止です。
まとめ
簡単ですがpowershellのループまとめです。
コマンドプロンプトのループよりほんの少し分かりやすいのでこちらの方が好みです。
ループを覚えておくと反復処理の小技が出来ますのでpowershellでも押さえておきたいですね。