【PowerShell】PowerShell7で色々できるようになったらしいので触ってみた

【PowerShell】PowerShell7で色々できるようになったらしいので触ってみた

はじめに

コジマです。

Developers.IOでPowerShell7が正式にリリースされた記事を発見
https://dev.classmethod.jp/articles/powershell-7-generally-available/#toc-10
今から約2か月前の記事ですね。

何が一番気になったかというと、三項演算子が使えるようになったらしい!

三項演算子はエンジニアの宗教上、好き嫌いが分かれますが、私は好きなので三項演算子試すついでに
他の追加機能も試してみたいと思います。

三項演算子

一般的な三項演算子の書き方と同じ書き方が使えました。

条件式 ? 真のとき : 偽の時
PS C:\Program Files\PowerShell\7> $a = 10
PS C:\Program Files\PowerShell\7> $a -eq 10 ? "yes" : "no" # yesが出てほしい
yes
PS C:\Program Files\PowerShell\7> $a = 5
PS C:\Program Files\PowerShell\7> $a -eq 10 ? "yes" : "no" # noが出てほしい
no

ForEach-Object -Parallel

ForEach-Objectに-Parallelをつけることで並列処理できるようになりました。
大きなデータを処理したいときとかに使えそうですね。

# 並列に5件ずつ処理
PS C:\Program Files\PowerShell\7> 1..10 | ForEach-Object -Parallel { "Time {0:HH:mm:ss} | Input : {1}" -f (Get-Date),$_; Start-Sleep -Seconds 5 }
Time 15:52:03 | Input : 1
Time 15:52:03 | Input : 2
Time 15:52:03 | Input : 3
Time 15:52:03 | Input : 4
Time 15:52:03 | Input : 5
Time 15:52:08 | Input : 6
Time 15:52:08 | Input : 7
Time 15:52:08 | Input : 8
Time 15:52:08 | Input : 9
Time 15:52:08 | Input : 10

# 1件ずつ処理
PS C:\Program Files\PowerShell\7> 1..10 | ForEach-Object { "Time {0:HH:mm:ss} | Input : {1}" -f (Get-Date),$_; Start-Sleep -Seconds 5 }
Time 15:52:21 | Input : 1
Time 15:52:26 | Input : 2
Time 15:52:31 | Input : 3
Time 15:52:36 | Input : 4
Time 15:52:41 | Input : 5
Time 15:52:46 | Input : 6
Time 15:52:51 | Input : 7
Time 15:52:56 | Input : 8
Time 15:53:01 | Input : 9
Time 15:53:06 | Input : 10
PS C:\Program Files\PowerShell\7> 1..20 | ForEach-Object -Parallel { "Time {0:HH:mm:ss} | Input : {1}" -f (Get-Date),$_; Start-Sleep -Seconds 5 } -ThrottleLimit 10
Time 15:59:44 | Input : 1
Time 15:59:44 | Input : 2
Time 15:59:44 | Input : 3
Time 15:59:44 | Input : 4
Time 15:59:44 | Input : 5
Time 15:59:44 | Input : 6
Time 15:59:44 | Input : 7
Time 15:59:44 | Input : 8
Time 15:59:44 | Input : 9
Time 15:59:44 | Input : 10
Time 15:59:49 | Input : 11
Time 15:59:49 | Input : 12
Time 15:59:49 | Input : 13
Time 15:59:49 | Input : 14
Time 15:59:49 | Input : 15
Time 15:59:49 | Input : 16
Time 15:59:49 | Input : 17
Time 15:59:50 | Input : 18
Time 15:59:50 | Input : 19
Time 15:59:50 | Input : 20

Pipeline chain operators (&& と ||)

Pipeline chain operatorsというのは、以下のような記述のこと。

A && B
=>Aが正常終了であればBを実行する

A || B
=>Aが正常集であればBは実行しない
PS C:\Program Files\PowerShell\7> Write-Output "A" && Write-Output "B" # Aが正常だからBも出力
A
B
PS C:\Program Files\PowerShell\7> Write-Outut "A" && Write-Output "B" # Aが異常だからBを出力せず終了
Write-Outut: The term 'Write-Outut' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
PS C:\Program Files\PowerShell\7> Write-Output "A" || Write-Output "B" # Aが正常だからBを出力しない
A
PS C:\Program Files\PowerShell\7> Write-Outpt "A" || Write-Output "B" # Aが異常だからBを出力する
Write-Outpt: The term 'Write-Outpt' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
B

NULL合体演算子(??、??=)

NULL合体演算子というのは以下のよう。

A ?? B
=>AがNULLの場合、Bを返す

A ??= B
=>AがNULLの場合、BをAに代入する
PS C:\Program Files\PowerShell\7> $A = $null
PS C:\Program Files\PowerShell\7> $B = "not null"
PS C:\Program Files\PowerShell\7> $A ?? $B #AがNULLだからBを返す
not null
PS C:\Program Files\PowerShell\7> $A = "not null"
PS C:\Program Files\PowerShell\7> $B = $null
PS C:\Program Files\PowerShell\7> $A ?? $B #AがNULLでないとき、Bは関係ない
not null
PS C:\Program Files\PowerShell\7> $A = $null
PS C:\Program Files\PowerShell\7> $B = "not null"
PS C:\Program Files\PowerShell\7> $A ??= $B #AがNULLなので、BをAに代入
PS C:\Program Files\PowerShell\7> Write-Output $A
not null
PS C:\Program Files\PowerShell\7> $A = "A is not null"
PS C:\Program Files\PowerShell\7> $B = "not null"
PS C:\Program Files\PowerShell\7> $A ??= $B #AがNULLでないので、BをAに代入しない
PS C:\Program Files\PowerShell\7> Write-Output $A
A is not null

エラー表示の簡素化

エラーの表示がすっきりしました。

PS C:\> Write-Outpt "A"
Write-Outpt : 用語 'Write-Outpt' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として
認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再
試行してください。
発生場所 行:1 文字:1
+ Write-Outpt "A"
+ ~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Write-Outpt:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
PS C:\Program Files\PowerShell\7> Write-Outpt "A"
Write-Outpt: The term 'Write-Outpt' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

個人的に、赤文字の威圧すごいなと思ってたんで、嬉しいですね。

さいごに

個人的にはエラーがすっきりしたのと、三項演算子使えるようになったのがよかったですね。
Parallelの恩恵を享受できるくらいがっつり触りたい気持ちもありますね。

この記事を面白いまたは役に立ったと思ってくれた方は是非私のTwitter(@kojimanotech)を
フォローしてくれたらうれしいです!

以上、コジマでした。


PowerShellカテゴリの最新記事