某PCショップ店員の覚書

勤務中に作成したプログラムやスクリプトのまとめ

PowerShell 5系で使えていたGet-WmiObjectがPowerShell 7系で使えなくなった件

最近、開発環境のPowerShellのバージョンが変わりまして、今まで動作していた一部のスクリプトが動作しなくなってしまいました。
具体的に↓
Get-WmiObjectを利用していたスクリプトで以下のエラーが頻出する

サンプルプログラム

# ポリシーの変更
Set-ExecutionPolicy Set-ExecutionPolicy RemoteSigned -Scope Process

# メモリ情報の取得
$memInfo = Get-WmiObject Win32_PerfFormattedData_PerfOS_Memory
# 利用可能メモリ容量の取得(単位:MBytes)
$avamem = $memInfo.AvailableMBytes
# Testlimit64.exe に渡す引数の設定
$Argument = "-d -c " + $memInfo.AvailableMBytes

# Testlimit64.exe の呼び出し
Start-Process Testlimit64.exe -ArgumentList $Argument

exit 0

Get-WmiObject: The term 'Get-WmiObject' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

今まで使えていたのにおかしいなと思い調べたところ、PowerShell 5系では確かに存在して使えていましたが、PowerShell7系になってから廃止されたようです。
以下のようにすることで解決しました。

# ポリシーの変更
Set-ExecutionPolicy Set-ExecutionPolicy RemoteSigned -Scope Process

# メモリ情報の取得
$memInfo = Get-CimInstance -ClassName Win32_PerfFormattedData_PerfOS_Memory
# 利用可能メモリ容量の取得(単位:MBytes)
$avamem = $memInfo.AvailableMBytes
# Testlimit64.exe に渡す引数の設定
$Argument = "-d -c " + $memInfo.AvailableMBytes

# Testlimit64.exe の呼び出し
Start-Process Testlimit64.exe -ArgumentList $Argument

exit 0

今までGet-WmiObjectだったのが Get-CimInstanceに置き換わって引数に「-ClassName」等が必要になっただけですね。

正直廃止するならIDE上から「今使えなくなったからこっち使って」のようなサジェスト機能つけてほしいです...

ちなみに、PowerShell 7系になって廃止されたコマンドは以下のページから見ることができます。
私個人はGet-WmiObjectしか使っていないので被害は軽微でした。
learn.microsoft.com