PowerShellでPCスペックを一括表示する関数を作る

ChatGPTにアドバイス聞きたいとき用にコンパクトに作れるのが欲しかった
メルカリで売るときとかにも使えそう

※GPUのRAM容量がうまく表示されないみたいです。
nvidia-smiを使う方法についてコメントへ (AMDとIntelは知らない)

# 要点を書きだすスクリプト

```powershell

function Show-Spec {
  function gb($bytes) {
    "$([Math]::Ceiling($bytes / 1GB))GB"
  }

  function mb($bytes) {
    "$([Math]::Ceiling($bytes / 1MB))MB"
  }

  # https://learn.microsoft.com/en-us/dotnet/api/microsoft.powershell.commands.pcsystemtypeex?view=powershellsdk-1.1.0
  function sysTypeEXStr([int]$sysTypeExNum) {
    @{
      0 = 'Unspecified';
      1 = 'Desktop';
      2 = 'Mobile';
      3 = 'Workstation';
      4 = 'Enterprise Server';
      5 = 'SOHO Server';
      6 = 'Appliance PC';
      7 = 'Performance Server';
      8 = 'SLATE';
      9 = 'Maximum';
    }[$sysTypeExNum]
  }

  # https://learn.microsoft.com/ja-jp/windows/win32/cimwin32prov/win32-processor#properties
  function cpuArchStr([int]$cpuArchNum) {
    @{
      0  = 'x86';
      1  = 'MIPS';
      2  = 'Alpha';
      3  = 'PowerPC';
      5  = 'ARM';
      6  = 'ia64';
      9  = 'x64';
      12 = 'ARM64';
    }[$cpuArchNum]
  }

  $comp = Get-CimInstance CIM_ComputerSystem
  $bios = Get-CimInstance CIM_BIOSElement
  Write-Output @(
    "* Model: $($comp.Model.trim())"
    "  * Manufacturer: $($comp.Manufacturer.trim())"
    "  * SystemFamily: $($comp.SystemFamily.trim())"
    "  * Type: $(sysTypeEXStr $comp.PCSystemTypeEX)"
    "  * BIOS: $($bios.Name.trim()) (Version: $($bios.Version.trim()))"
  )

  $os = Get-CimInstance CIM_OperatingSystem
  Write-Output @(
    "* OS: $($os.Caption.trim())"
    "  * Version: $($os.Version.trim())"
    "  * Architecture: $($os.OSArchitecture.trim())"
  )

  $cpu = Get-CimInstance CIM_Processor
  Write-Output @(
    "* CPU: $($cpu.Name.trim()) (Arch: $(cpuArchStr $cpu.Architecture))"
    "  * Max: $($cpu.MaxClockSpeed / 1000) GHz"
    "  * Cores: $($cpu.NumberOfCores) ($($cpu.ThreadCount) Threads)"
    "  * Cache Size: L2 $(mb ($cpu.L2CacheSize * 1KB)), L3 $(mb ($cpu.L3CacheSize * 1KB))"
  )

  Write-Output "* Graphics:"
  Get-CimInstance CIM_VideoController | ForEach-Object {
    Write-Output @(
      "  * $($_.VideoProcessor.trim()):"
      "    * RAM: $(gb $_.AdapterRAM)"
      "    * Connected Display: $($_.VideoModeDescription.trim()) ($($_.MaxRefreshRate) fps)"
    )
  }
  
  $mems = Get-CimInstance CIM_PhysicalMemory
  Write-Output "* Memories: $(gb $comp.TotalPhysicalMemory) (count:$($mems.count))"
  $mems | ForEach-Object {
    Write-Output @(
      "  * $($_.PartNumber.trim()) (Manufacturer: $($_.Manufacturer.trim())):"
      "    * Size: $(gb $_.Capacity)"
      "    * Speed: $($_.Speed) MHz (data width: $($_.DataWidth) bits)"
    )
  }

  Get-CimInstance CIM_DiskDrive | ForEach-Object {
    "* Storage: $($_.Model.trim())"
    "  * Size: $(gb $_.Size)"
  }
  Write-Output ""
}

show-spec
```

こんな感じになる

> * Model: 83B2
>   * Manufacturer: LENOVO
>   * SystemFamily: Yoga 6 13ABR8
>   * Type: Mobile
>   * BIOS: L5CN17WW (Version: LENOVO - 1)
> * OS: Microsoft Windows 11 Home
>   * Version: 10.0.22631
>   * Architecture: 64 ビット
> * CPU: AMD Ryzen 7 7730U with Radeon Graphics (Arch: x64)
>   * Max: 2 GHz
>   * Cores: 8 (16 Threads)
>   * Cache Size: L2 4MB, L3 16MB
> * Graphics:
>   * AMD Radeon Graphics Processor (0x15E7):
>     * RAM: 2GB
>     * Connected Display: 1920 x 1200 x 4294967296 colors (60 fps)
> * Memories: 14GB (count:2)
>   * MT53E1G32D4NQ-046 (Manufacturer: Micron Technology):
>     * Size: 8GB
>     * Speed: 4266 MHz (data width: 32 bits)
>   * MT53E1G32D4NQ-046 (Manufacturer: Micron Technology):
>     * Size: 8GB
>     * Speed: 4266 MHz (data width: 32 bits)
> * Storage: WD PC SN740 SDDPMQD-512G-1101
>   * Size: 477GB

なんかクロック低い気がするけど

# 全部書き出すスクリプト

要点だけじゃなくいっそ全部保存しておきたいとき用
カレントディレクトリにフォルダ作ってテキストファイルで全部保存

```powershell
function Export-Spec {
  $dir = ".\spec-$env:COMPUTERNAME"
  new-item -path $dir -ItemType Directory -Force | Out-Null

  $cim_classes = @(
    "CIM_ComputerSystem",
    "CIM_OperatingSystem",
    "CIM_BIOSElement",
    "CIM_Processor",
    "CIM_VideoController",
    "CIM_PhysicalMemory",
    "CIM_DiskDrive"
  )
  
  foreach ($class in $cim_classes) {
    Get-CimInstance $class | Select-Object * > "$dir\$class.txt"
  }
}

Export-Spec
```

# Tips

`Get-CimInstance`を使うとシステムの管理情報にアクセスできる。
`Get-WmiObject`というコマンドでも同じようにアクセス可能だけどこっちは古いらしい。

どんなクラスがあるかは`get-cimclass`を実行と全て表示できる。
`Win32_...`となっているものと`CIM_...`となっているものがあって
`CIM_...`となっているものが新しく、クロスプラットフォームを意識したものらしい。

新しいPowerShellはクロスプラットフォーム対応しているのでMacやLinuxでも動くようにってことっぽいけど結局ほぼWindowsでしか使われておらず、正直どっち使ってもよさそう

あとは`systeminfo`や`Get-ComputerInfo`も使えそう

# 断念したこと:
- グラフィックカードの型番やメーカーは表示できなさそうだった (不可能？)
   - PowerShellで表示できる方法が分かる方いたら教えてください😭
    - GPU-Zではsubvendorは表示できてるから可能なのかも
    - GPU-Zでもグラフィックカードのモデル(MSI GeForce RTX 3060 Ti AERO ITXみたいな)は表示できないから無理かも
- GPUの性能はモデルで分かるからとりあえずRAM容量だけ分かればいいかもしれん
    - けどグラフィックカードのモデルも確認できたほうが便利ではある、不可能ならしゃーない

# ChatGPTに渡してみる


* ChatGPTに渡してみる
> User
> このPCで生成AIを動かすことは可能？
> 
> * SystemFamily: Yoga 6 13ABR8
>   * Model: 83B2
>   * Manufacturer: LENOVO
>   * BIOS: L5CN17WW (Version: LENOVO - 1)
> * OS: Microsoft Windows 11 Home
>   * Version: 10.0.22631
>   * Architecture: 64 ビット
> * CPU: AMD Ryzen 7 7730U with Radeon Graphics
>   * Max: 2 GHz
>   * Cores: 8 (16 Threads)
>   * Cache Size: L2 4MB, L3 16MB
> * Graphics:
>   * AMD Radeon Graphics Processor (0x15E7):
>     * RAM: 2GB
>     * Connected Display: 1920 x 1200 x 4294967296 colors (60 fps)
> * Memories: 14GB (count:2)
>   * MT53E1G32D4NQ-046 (Manufacturer: Micron Technology):
>     * Size: 8GB
>     * Speed: 4266 MHz (data width: 32 bits)
>   * MT53E1G32D4NQ-046 (Manufacturer: Micron Technology):
>     * Size: 8GB
>     * Speed: 4266 MHz (data width: 32 bits)
> * Storage: WD PC SN740 SDDPMQD-512G-1101
>   * Size: 477GB
> 
>> ChatGPT
>> あなたのPCのスペックを見る限り、一般的なAIアプリケーションを動かすことは十分に可能です。特に、以下の点が重要です：
>> 
>> CPU: AMD Ryzen 7 7730Uは、効率的なマルチタスク処理と高速処理を提供する8コア16スレッドのCPUです。AIモデルの学習や推論において、このCPUは十分なパフォーマンスを提供するでしょう。
>> 
>> グラフィックス: AMD Radeon Graphicsは、基本的なAI関連のタスクに適しています。ただし、非常に大規模なモデルや高度なグラフィックス処理を伴うタスクでは、専用のGPUの方がパフォーマンスは高いでしょう。
>> 
>> メモリ: 14GBのRAMは、多くのAIアプリケーションにおいて十分なメモリ容量を提供します。大量のデータを扱う場合や複雑なモデルを使用する場合には、より多くのメモリが必要になることもあります。
>> 
>> ストレージ: 477GBのSSDは、高速なデータアクセスと十分なストレージ容量を提供します。AIアプリケーションのインストールやデータセットの保存に適しています。
>> 
>> ただし、一点留意すべきことは、AIモデルの種類や規模によっては、より高性能なハードウェアが必要になる場合があるということです。例えば、GPT-4のような大規模な言語モデルを自分で訓練したり、複雑な深層学習モデルを使う場合には、より強力なGPUや追加のRAMが必要になることがあります。
>> 
>> また、AIの学習や推論をローカルで行う代わりに、クラウドベースのサービスを利用することも一つの選択肢です。これにより、ハードウェアの制約を受けずにAIモデルを使用することができます。
> 
> User
> このPCでは？
> 
> * SystemFamily: B450 MB
>   * Model: B450 I AORUS PRO WIFI
>   * Manufacturer: Gigabyte Technology Co., Ltd.
>   * BIOS: F64a (Version: ALASKA - 1072009)
> * OS: Microsoft Windows 11 Pro
>   * Version: 10.0.22631
>   * Architecture: 64 ビット
> * CPU: AMD Ryzen 7 3700X 8-Core Processor
>   * Max: 3.6 GHz
>   * Cores: 8 (16 Threads)
>   * Cache Size: L2 4 MB, L3 32 MB
> * Graphics:
>   * NVIDIA GeForce RTX 3060 Ti:
>     * RAM: 4 GB
>     * Connected Display: 3840 x 2160 x 4294967296 colors (60 fps)
> * Memories: 32 GB (count:2)
>   * W4U3200PS-16G (Manufacturer: Unknown):
>     * Size: 16 GB
>     * Speed: 3200 MHz (data width: 64 bits)
>   * D4U3200CS-16G (Manufacturer: Unknown):
>     * Size: 16 GB
>     * Speed: 3200 MHz (data width: 64 bits)
> * Storage: ADATA SX8200PNP
>   * Size: 1908 GB
>
>> ChatGPT
>> このPCの構成はAIアプリケーションを実行するのに非常に適しています。特に以下のスペックが重要です：
>> 
>> CPU: AMD Ryzen 7 3700Xは、8コア16スレッドを持ち、最大3.6 GHzの速度を提供します。これはAIの学習や推論において優れた性能を発揮します。
>> 
>> グラフィックス: NVIDIA GeForce RTX 3060 Tiは、AI関連の作業において高いパフォーマンスを発揮するGPUです。特にディープラーニングや機械学習の計算において、その4GBのRAMは効果的に働きます。
>> 
>> メモリ: 32GBのRAMは、AIアプリケーションにおいて非常に十分な容量を提供します。これにより、大規模なデータセットや複雑なモデルを効率的に扱うことができます。
>> 
>> ストレージ: 1908GBのSSDは、高速なデータアクセスと大容量のストレージを提供します。これにより、大量のデータセットやアプリケーションを保存するのに十分なスペースがあります。
>> 
>> このPCは、AIモデルの訓練や推論、ディープラーニングの実験において、高性能を発揮するでしょう。また、高解像度の画像やビデオ処理、3Dモデリングなどのグラフィックス集約的な作業にも適しています。大規模なモデルや非常に複雑な計算が必要なプロジェクトを除き、ほとんどのAI関連作業に対応できるはずです。