😅

PowerShellで最低限のPC情報を取りたい話

2023/03/24に公開

概要

PowerShell にて、SystemInfo, Get-PSDrive, Get-PhisicalDrive, Get-WmiObject -Class Win32_Processor などを参照して自分に必要な情報を抽出するためのScript作成の備忘録です。

背景

私は現在ソフトウェア開発の業務をしていないのですが、個人で開発技術勉強用をするためのマシンとして、第4世代Core-i5、SSD128GBくらいの中古デスクトップPCを1万円程で購入しました。
Webページ閲覧、IDEとスクリプト実行とテキスト編集がメイン用途なので、必要十分なSpecなはずですが、実際足りているのかというところを調べたいと思いました。

目的

  • メモリ増設をする必要があるか、SSD空き容量枯渇しないか定期的に確認できるようにする
  • 知人のマシンとも比較できるようにスクリプトを作る
    • 出力要件
      • 機種名 (ネット検索して本体仕様を調べるときに使う)
      • OS名 (いつでも参照できるようにしたい)
      • CPU名(いつでも参照できるようにしたい)
      • 物理メモリの空きと使用量か合計
      • SSDの空きと使用量が合計
  • 大分Powershell忘れているので、少し思い出す
  • なんとなくVSCodeに慣れる
  • ついでにzennの投稿を試しにしてみたい

開発手順

  1. やりたい事をGoogle検索してPowershell対話型スクリプト上で実行して動作を把握する
  2. SystemInfoで取れない情報も欲しいので、足りないものを調べて追加していく
  3. 調べたことをそのままScriptファイルにする
  4. 一応ダブルクリックで実行する為のバッチファイルを作る

使用するコマンド(レット)とその用途

基本SystemInfoで間に合わせたかったのですが、足りない部分を調べました。

  • systeminfo
    • コマンドレットではありませんが結果をオブジェクト代入行列要素を指定して出力するのに使います。
    • 一度対話実行で出力して行数と照合して必要な要素が何行目にあるか泥臭く調べて使いました。
      • 13行目 : システムモデル
      • 2行目:OS名
      • 15行目 : CPU情報ですが、 Intel64 Family 6 Model 60 Stepping 3 GenuineIntel ~3301 Mhz のように、見慣れない表記がされています。
      • 24行目:物理メモリの合計
      • 25行目:物理メモリの空き
  • Get-PhysicalDisk
    • 物理ディスクの一覧取得です。私のマシンはディスクが1つなのですが、2つ以上の場合は配列で返ってくると思うので調整が必要です。
    • MediaTypeというスクリプトプロパティでSSDかHDDなのかがわかります。SSDで確認したため、HDDの場合の出力は不明です。
    • 実行時間のボトルネックになっているので、コメントアウトして出力からも取ったほうがいいと思っています
  • Get-PSDrive
    • 論理ドライブの一覧を取得して、free(空き)Used(使用済)のスクリプトプロパティを参照しています。
    • パーティション切ってないのでC決め打ちで参照しています。
    • そのままプロパティ参照するとByte数で表記されるので 1GBで除算して整数出力しています。
  • Get-WmiObject -Class Win32_Processor
    • プロセッサのWMIオブジェクトを取得して、Nameプロパティを参照しています。
    • Core i5のようなCPU名表記を取得するのに使いました。
  • powershell -ExecutionPolicy "RemoteSigned"
    • この件とあまり関係ありませんが、バッチ実行時に実行ポリシー設定を無視して、実行するファイルが信頼できるものだと指示して動かします。
  • pause
    • コンソール出力させるバッチだと待つのが一番楽なので最後に待ちます。

サンプル

出先でもメモ帳さえあれば両ファイルを作成してコピペして同じフォルダにおいてバッチファイルをたたくだけでWindowsなら実行できる想定です。

スクリプト本文

PCStatus.ps1
$sys = systeminfo
$hpd = Get-PhysicalDisk
$hoge = Get-PSDrive C
$hogeProc = Get-WmiObject -Class Win32_Processor

# ここから出力
$sys[13]
$sys[2]
$hogeProc.Name
$sys[24]
$sys[25]
$hogeout = `
    "System Disk MediaType: {0}, Free {1:N0}GB, USED{2:N0}GB" `
    -f $hpd.MediaType,($hoge.free/1GB),($hoge.Used/1GB) 
$hogeout
Write-Output "おしまい"

どこでも実行用バッチファイル

  • これはダブルクリック実行用途なので、管理者として実行する体で実行ポリシー指定ができる人であれば不要です。
  • 環境によってはファイルをUTF-8で保存して、chcp 65001する必要があるかもしれません。
CheckPCStatu.bat
powershell -ExecutionPolicy "RemoteSigned" .\PCStatus.ps1
pause

手元での実行結果

システム モデル:        HP ProDesk 600 G1 SFF
OS 名:                  Microsoft Windows 10 Pro
Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
物理メモリの合計:       8,098 MB
利用できる物理メモリ:   3,581 MB
System Disk MediaType: SSD, Free 70GB, USED49GB
おしまい
続行するには何かキーを押してください . . .

参考書籍など

https://kapibara-sos.net/archives/318

https://www.pct.co.jp/techinical_note20180725

https://qiita.com/s4i/items/75c19c9feb10b54c1ce9

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/get-psdrive?view=powershell-7.3

https://amzn.asia/d/3yFsXUc

まとめと課題

  • VScodeに慣れる以外の目的は達成しましたが、定期的に出力をどこかに吐き出す仕組みの方がいいかもしれません。
    • エンコード変更はパレットからできるようになりましたが、PS1ファイルをBOM付きUTF-8で保存しなくてはまったり等しました。
  • 動的に変化しない要素は(SSDかとか)取らないようにしたほうがよかったなと思います。
    • 多分物理ディスクを参照する箇所が不要なボトルネックになっていて手元のマシンは合計3-5秒かかっています。
  • オブジェクトやプロパティを出力文替わりにする等、コーディング規則的なことが皆無な野蛮なスクリプトなので、人様に見ていただけるような内容に修正が必要です。
  • 不慣れな中古キーボードを使っていますが、Zennで記事をかくのに`(バッククォート)を多用したのでいいリハビリになりました。
  • これ書いてる時間と手間でSSD、物理メモリ共に増設したほうが早いなと思いました。

Discussion