某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

f5.si へPowershellからHTTP GETリクエストを投げる方法

身内にDDNSの「f5.si」を利用している人が居るので、その人向けにPowershell上からf5.siへHTTP GETリクエストを投げ、ホスト名を変更する方法を書きます。

# f5.si へHTTP GETリクエストを投げる
# グローバルIPアドレスの取得
$address = (Invoke-WebRequest -Uri "inet-ip.info/ip").Content

# 投げるGETリクエスト先
$url = "https://f5.si/update.php?domain=USERNAME&password=PASSWORD&ip=$address" # ipv4 address

# レスポンス Write-Host $res 等で詳細を表示可能
$res = Invoke-WebRequest $url

# ループさせないのでswitch caseではなくif elseifを利用
if ($res.Content -ne "OK:SUCCESS (good)"){
    if($res.Content -eq "ERROR:100"){
        Write-Warning "パスワードまたはトークンが間違っています"
    }elseif($res.Content -eq "ERROR:110"){
        Write-Warning "ユーザー名が間違っています"
    }elseif($res.Content -eq "ERROR:120"){
        Write-Warning "IPアドレスの形式が不正です"
    }elseif($res.Content -eq "ERROR:200"){
        Write-Warning "[システムエラー]DBサーバーに接続不能です"
    }elseif($res.Content -eq "ERROR:210"){
        Write-Warning "[システムエラー]DNSサーバーに接続不能です"
    }elseif($res.Content -eq "ERROR:300"){
        Write-Warning "[システムエラー]更新確認ができませんでした"
    }elseif($res.Content -eq "ERROR:400"){
        Write-Warning "詳細設定でCNAMEが設定中のためAレコードが利用不可です"
    }else{
        Write-Warning "不明なエラー"
    }
    Write-Warning "エラーが発生しているため、更新ができませんでした。"
    Write-Warning "エラー内容にしたがって該当箇所を修正し、再度スクリプトを実行してください"
}
pause
exit

USERNAMEとPASSWORDを自分の登録情報へ変更すれば問題なく変更できるはずです。
※ f5.siを利用していないのでテストもデバッグもしてません。

DiCE等を利用しないメリットとしては

  • タスクスケジューラに登録すればDiCEより短い間隔で更新の手続きを行える
  • DiCEとf5.si用追加batをダウンロードする必要がない

以上です。

Google Chromeの自動ダウンロードとインストール

Google Chromeの自動ダウンロードとインストールを行うスクリプトを見つけましたので共有します。
参照したサイト:

log.noid11.com

$Path = $env:TEMP
$Installer = "chrome_installer.exe"
Invoke-WebRequest "https://dl.google.com/tag/s/appguid%3D%7B8A69D345-D564-463C-AFF1-A69D9E530F96%7D%26browser%3D0%26usagestats%3D1%26appname%3DGoogle%2520Chrome%26needsadmin%3Dprefers%26brand%3DGTPM/update2/installers/ChromeSetup.exe" -OutFile $Path\$Installer
Start-Process -FilePath $Path\$Installer -Args "/silent /install" -Verb RunAs -Wait
Remove-Item $Path\$Installer
Write-Host "Google Chromeのダウンロードとインストール処理が完了しました"
pause

※アドレスが途中で切れていますが、スクリプト全てをコピーすれば正しいアドレスが出ます。

自動でダウンロードとインストールを行い、インストーラーは自動で削除してくれるので大変便利です。
外部ストレージなどにスクリプトを保存し、パソコンを新規購入した際や初期化を行った際に実行してください。

Windows パソコンの設定を変えてゲームのパフォーマンスを上げよう

皆さん、ゲーミングパソコンを購入あるいは自作してからパソコンの設定は変えていますか?
例えば電源プランの変更やマウス加速のOFFなど、ゲームのパフォーマンスを上げる設定はいくつかあります。
今回はPowershellから変更できる項目を自動で変更してくれるスクリプトを組んだので紹介します。

###########################################################################
# オートゲーミングセッター(Auto Gaming Setter) 
# 設定する項目
# ・マウス加速のOFF
# ・電源プランの変更 -高パフォーマンス
# ・高速スタートアップの無効化
# ・高速シャットダウンの無効化 
# Author   : saica
#  blog    : https://saica94.hatenablog.com/
#  Twitter : https://twitter.com/daikiy6111
#  Discord : agumon#1648
###########################################################################

###########################################################################
# 管理者権限でなければ昇格してから実行
###########################################################################
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")){
    Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs
    exit
}

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

###########################################################################
# メイン処理
###########################################################################
# マウス加速をoffにするためのレジストリパスの指定
$reg_path = "HKCU:\Control Panel\Mouse"
$reg_key1 = "MouseSpeed"
$reg_key2 = "MouseThreshold1"
$reg_key3 = "MouseThreshold2"

# キーを更新する
Write-Host "マウス加速をOFFにします"
Set-ItemProperty $reg_path -name $reg_key1 -value "0"
Set-ItemProperty $reg_path -name $reg_key2 -value "0"
Set-ItemProperty $reg_path -name $reg_key3 -value "0"
Write-Host "マウス加速をOFFにしました。"

# 電源プランの変更
Write-Host "-----------------------------------------------------------------"
# Ryzen 5000シリーズは電源プランを変更すると逆にパフォーマンスが落ちるのでRyzen 5000シリーズCPUを使っている場合は変更しない
# CPU名の取得
$ReturnData = New-Object PSObject | Select-Object CPUName
$Win32_Processor = Get-WmiObject Win32_Processor
$ReturnData.CPUName = @($Win32_Processor.Name)[0]

if ($ReturnData.CPUName -Like "AMD Ryzen * 5**0*") {
    Write-Host "Ryzen 5000シリーズはバランスプランが推奨されているため、電源プラン設定を変更せずスキップします。" -BackgroundColor Yello -ForegroundColor Red
    # 休止状態を無効にし、高速スタートアップを自動的に無効化させる
    powercfg /hibernate off
    powercfg -setacvalueindex scheme_balanced sub_buttons pbuttonaction 3
} else {
    Write-Host "電源プラン設定を変更中..."
    # 電源プランを高パフォーマンスに変更
    powercfg /setactive scheme_min
    Write-Host "電源プランの設定 高パフォーマンス化が完了しました。"
    powercfg /hibernate off
    powercfg -setacvalueindex scheme_min sub_buttons pbuttonaction 3
    Write-Host "高速スタートアップを無効化しました。"
}
Write-Host "電源プランの設定が完了しました。"
Write-Host "-----------------------------------------------------------------"
Write-Host "全ての処理が完了しました。"
Write-Host "念のため、パソコンを再起動させてください。"
Write-Host "プログラムを終了します。"
pause
exit

上記のスクリプトPowershell ISEで実行するか、.ps1形式で保存して実行すれば自動で設定を行ってくれます。
変更する項目は
・マウス加速のOFF
・電源プランの変更
・高速スタートアップの無効化
です。
私が使っているスクリプトにはさらにGPUドライバのインストールも自動化の対象となっていますが
RadeonGeForceかで別れますし、この記事を見る方にとってはGPUドライバのダウンロードも若干難易度が高いかもしれないので
このスクリプトからは除外しています。

念のため、GPUドライバの自動アップデートも知りたい!という方のためにスクリプトを続きに書いておきますので
気になる方は続きをどうぞ。

続きを読む

Powershellにインストールされているモジュールを一括でアップデートする

暇つぶしにPowershellにインストールされているモジュールを一括でアップデートするスクリプトを書いたので共有します。

# 管理者権限へ昇格させる
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")){
    Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs
    exit
}
# ポリシーの変更
Set-ExecutionPolicy RemoteSigned -Scope Process -Force

# インストールされたモジュールを表示
Write-Host "インストールされたモジュールを表示します。"
Get-InstalledModule

# ModulesのUpdate処理
Get-InstalledModule | ForEach-Object {
$Module_name = $_.Name
Write-Host $Module_name "をアップデート中です"
Update-Module -Name $Module_name
}

Write-Host "全てのアップデート処理が完了しました"
pause
exit

うまくいけば

こんな感じに。


たったこれだけでインストールされたモジュールの一括アップデートができます。
使ってみてね。