【bat】バッチファイルでシステム情報をレポート化する方法(msinfo32活用)

【bat】バッチファイルでシステム情報をレポート化する方法(msinfo32活用) bat

Windowsのシステム情報を定期的に記録したい、障害発生時に素早くエビデンスを取りたい──そんな場面で役立つのが、Windows標準搭載のmsinfo32.exeをバッチファイルで自動化する方法です。

msinfo32はGUIで起動するだけでなく、コマンドラインから/report/nfoオプションを使ってシステム情報をファイルに出力できます。バッチファイルと組み合わせることで、日付付きファイル名での自動保存・タスクスケジューラによる定期実行・複数PCの一括収集など、幅広い自動化が可能になります。

本記事では基本構文から、systeminfo・wmic・PowerShellとの連携、実践的なインベントリ管理バッチまで、すぐに使えるテンプレートを交えて解説します。

スポンサーリンク

はじめに:msinfo32とは?なぜバッチで使うのか

Windowsには標準で msinfo32.exe(システム情報)というツールが搭載されています。GUIで起動するとハードウェア・ソフトウェア・ネットワークに関する詳細情報が一覧表示されますが、このツールはコマンドラインからも操作でき、テキストやNFO形式でレポートを出力することができます。

バッチファイルと組み合わせると、次のようなことが可能になります。

msinfo32をバッチで使うメリット

  • 定期的なシステム情報の自動収集・記録
  • 障害発生時のエビデンス(証拠)を即座に採取
  • 複数PCの情報を一括で取得してインベントリ管理
  • レポートをメールで自動送信し、リモート管理を効率化
  • タスクスケジューラと組み合わせた定期自動実行

本記事では、msinfo32の基本構文から始め、日付付きファイル名での保存、カテゴリ絞り込み、systeminfo・wmic・PowerShellとの組み合わせ、複数PC一括収集、タスクスケジューラ登録、メール送信、HTML整形まで、実務で使える実践テンプレートをすべて解説します。

msinfo32コマンドの基本構文

msinfo32.exe はコマンドプロンプトから以下の構文で実行します。

基本構文
msinfo32 [/report <ファイルパス>] [/nfo <ファイルパス>] [/categories <カテゴリ>]

主なオプションを以下の表にまとめます。

オプション 形式 説明
/report テキスト(.txt) システム情報をテキスト形式で出力。人が読めるプレーンテキスト。
/nfo NFO(.nfo) msinfo32のGUI画面で読み込めるバイナリ形式。情報量が最も多い。
/categories フィルター 出力するカテゴリを絞り込む。/reportと組み合わせて使う。
/computer リモート指定 リモートコンピューター名を指定して情報を取得(要ネットワーク権限)。

注意:msinfo32は起動から情報収集完了まで数秒〜30秒程度かかる場合があります。バッチファイルではtimeout /t 35 /nobreakなどで待機するか、start /waitで同期実行することを推奨します。

テキストレポート出力(/report)の基本バッチ

最もシンプルな使い方として、/report オプションでテキストファイルに出力するバッチを作成します。

basic_report.bat
@echo off
setlocal

rem システム情報レポートを出力するバッチ
set OUTPUT=C:\Reports\sysinfo.txt

rem 出力フォルダが存在しなければ作成
if not exist C:\Reports mkdir C:\Reports

rem msinfo32でシステム情報をテキスト出力(/waitで完了まで待機)
start /wait msinfo32 /report %OUTPUT%

echo レポートを出力しました: %OUTPUT%
endlocal

start /wait を使うことで、msinfo32の処理が完了するまでバッチが次のコマンドに進まないようにできます。出力されたテキストファイルはメモ帳などで開いて確認できます。

ポイント:start /wait はmsinfo32に限らず、外部プロセスの完了を待ちたいときに便利なテクニックです。GUIアプリを起動して閉じるまで待機する場合にも使えます。

NFOファイル出力(/nfo)とGUI再読み込み

NFO形式はmsinfo32独自のバイナリ形式で、GUIツールで開くことでツリー構造の詳細情報を確認できます。テキストより多くの情報を保存でき、後から詳しく調査したい場合に便利です。

nfo_report.bat
@echo off
setlocal

rem NFO形式でシステム情報を保存
set OUTPUT_NFO=C:\Reports\sysinfo.nfo

if not exist C:\Reports mkdir C:\Reports

rem /nfo オプションでNFOファイルを生成
start /wait msinfo32 /nfo %OUTPUT_NFO%

echo NFOファイルを出力しました: %OUTPUT_NFO%

rem GUIで開く場合(コメントアウトを外して使用)
rem msinfo32 %OUTPUT_NFO%

endlocal

保存したNFOファイルを再度開くには、ファイルをダブルクリックするか、コマンドで msinfo32 C:\Reports\sysinfo.nfo と実行します。GUIのツリー構造で詳細を確認できるため、障害解析や比較調査に役立ちます。

形式 拡張子 特徴 用途
テキスト .txt 人が読める・grep検索可能 ログ記録・差分比較
NFO .nfo 情報量最大・GUI表示 詳細調査・アーカイブ

日付・時刻付きファイル名で保存する方法

定期実行するバッチでは、ファイルを上書きせずに日付・時刻付きのファイル名で保存することが重要です。バッチファイルでは %DATE%%TIME% 変数を使いますが、これらの書式はロケールによって異なるため、文字列操作で整形します。

dated_report.bat
@echo off
setlocal enabledelayedexpansion

rem 日付を YYYYMMDD 形式に整形(例: 2026/03/11 → 20260311)
set YYYY=%DATE:~0,4%
set MM=%DATE:~5,2%
set DD=%DATE:~8,2%

rem 時刻を HHMMSS 形式に整形(例: 14:05:09 → 140509)
set HH=%TIME:~0,2%
set MIN=%TIME:~3,2%
set SS=%TIME:~6,2%

rem 時刻の先頭スペースをゼロに置換(1桁時刻対策)
set HH=%HH: =0%

rem タイムスタンプ付きファイル名を生成
set TIMESTAMP=%YYYY%%MM%%DD%_%HH%%MIN%%SS%
set OUTPUT_DIR=C:\Reports
set OUTPUT=%OUTPUT_DIR%\sysinfo_%TIMESTAMP%.txt

if not exist %OUTPUT_DIR% mkdir %OUTPUT_DIR%

echo レポート生成中: %OUTPUT%
start /wait msinfo32 /report %OUTPUT%

echo 完了しました。
endlocal

これにより sysinfo_20260311_140509.txt のようなファイルが生成されます。定期実行しても以前のレポートが上書きされないため、履歴管理が容易になります。

注意:日本語Windows環境では %DATE% の書式が「2026/03/11」(スラッシュ区切り)のケースが多いですが、ロケール設定によって異なります。実際に echo %DATE% で書式を確認してから桁数を調整してください。

/categories で出力範囲を絞る

/categories オプションを使うと、特定のカテゴリだけを出力できます。全情報を出力すると数百KBになる場合がありますが、必要な情報だけ絞ることで高速化・軽量化が可能です。

categories_report.bat
@echo off
setlocal

rem システムサマリーとハードウェア情報のみ出力
start /wait msinfo32 /report C:\Reports\hw_report.txt /categories +SystemSummary+Hardware

rem ネットワーク情報のみ出力
start /wait msinfo32 /report C:\Reports
et_report.txt /categories +Network

echo カテゴリ別レポートを出力しました。
endlocal

主なカテゴリ名の一覧を以下に示します。

カテゴリ名 内容
SystemSummary OS名・バージョン・製造元・プロセッサ・メモリ等の概要
Hardware ハードウェアリソース(IRQ・I/Oポート・DMA等)
Components デバイス(ディスク・CD-ROM・ディスプレイ等)の詳細
SoftwareEnv ドライバ・環境変数・起動プログラム・サービス等
Network ネットワークアダプター・プロトコル・WAN設定等

ポイント:複数カテゴリを指定する場合は + で繋げます。例:/categories +SystemSummary+Hardware+Network。必要な情報だけ絞ることで、実行時間を大幅に短縮できます。

systeminfoコマンドとの組み合わせ

msinfo32はリッチな情報を提供しますが、systeminfo コマンドはよりシンプルなテキスト出力でスクリプト処理に適しています。CPUコア数、物理メモリ、OSバージョン、インストール済みパッチ一覧などをすばやく取得できます。

combined_report.bat
@echo off
setlocal enabledelayedexpansion

set YYYY=%DATE:~0,4%
set MM=%DATE:~5,2%
set DD=%DATE:~8,2%
set STAMP=%YYYY%%MM%%DD%
set DIR=C:\Reports

if not exist %DIR% mkdir %DIR%

rem systeminfo でOS・メモリ・パッチ情報を取得
echo ===== systeminfo ===== > %DIR%\combined_%STAMP%.txt
systeminfo >> %DIR%\combined_%STAMP%.txt

rem msinfo32 でシステム詳細を追記
echo ===== msinfo32 ===== >> %DIR%\combined_%STAMP%.txt
start /wait msinfo32 /report %DIR%\msinfo32_tmp.txt
type %DIR%\msinfo32_tmp.txt >> %DIR%\combined_%STAMP%.txt
del %DIR%\msinfo32_tmp.txt

echo 統合レポート完成: %DIR%\combined_%STAMP%.txt
endlocal

systeminfo の代表的な出力項目を以下に示します。

項目 説明
OS Name OSの名称(例: Microsoft Windows 11 Home)
OS Version バージョン番号とビルド番号
Total Physical Memory 搭載物理メモリ合計
Processor(s) CPUの型番・コア数・クロック
Hotfix(s) 適用済みWindowsパッチの一覧

wmicコマンドで特定ハードウェア情報を取得する

wmic(Windows Management Instrumentation Command)を使うと、CPUの詳細・ディスク容量・ネットワークアダプター情報など、特定のハードウェア情報をコマンドラインで精密に取得できます。msinfo32の全体レポートとは異なり、必要な項目だけをCSV形式で出力することも可能です。

wmic_report.bat
@echo off
setlocal

set DIR=C:\Reports
if not exist %DIR% mkdir %DIR%

rem CPU情報を取得
echo --- CPU --- > %DIR%\wmic_report.txt
wmic cpu get Name,NumberOfCores,NumberOfLogicalProcessors,MaxClockSpeed /format:list >> %DIR%\wmic_report.txt

rem メモリ情報を取得
echo --- Memory --- >> %DIR%\wmic_report.txt
wmic memorychip get Capacity,Speed,Manufacturer /format:list >> %DIR%\wmic_report.txt

rem ディスク情報を取得
echo --- Disk --- >> %DIR%\wmic_report.txt
wmic diskdrive get Model,Size,InterfaceType /format:list >> %DIR%\wmic_report.txt

rem ネットワークアダプター情報
echo --- Network Adapter --- >> %DIR%\wmic_report.txt
wmic nic get Name,MACAddress,Speed /format:list >> %DIR%\wmic_report.txt

rem BIOS情報を取得
echo --- BIOS --- >> %DIR%\wmic_report.txt
wmic bios get Manufacturer,SMBIOSBIOSVersion,ReleaseDate /format:list >> %DIR%\wmic_report.txt

echo wmicレポート完成: %DIR%\wmic_report.txt
endlocal

注意:wmic は Windows 11 以降で非推奨(deprecated)となっています。代替として PowerShell の Get-WmiObject または Get-CimInstance の使用が推奨されます。ただし、Windows 10 環境では引き続き wmic が利用可能です。

PowerShellと組み合わせた高度な情報収集

PowerShell を活用すると、構造化されたデータとして情報を取得・加工できます。バッチファイルから PowerShell コマンドを呼び出し、JSON・CSV形式での出力や、複雑な条件での絞り込みが可能になります。

powershell_report.bat
@echo off
setlocal

set DIR=C:\Reports
if not exist %DIR% mkdir %DIR%

rem PowerShellでCPU・メモリ・ディスクをCSV出力
powershell -NoProfile -Command ^
  \"Get-CimInstance Win32_Processor | Select-Object Name,NumberOfCores,MaxClockSpeed | Export-Csv -Path \'C:\Reports\cpu.csv\' -NoTypeInformation -Encoding UTF8\"

powershell -NoProfile -Command ^
  \"Get-CimInstance Win32_PhysicalMemory | Select-Object Manufacturer,Capacity,Speed | Export-Csv -Path \'C:\Reports\memory.csv\' -NoTypeInformation -Encoding UTF8\"

powershell -NoProfile -Command ^
  \"Get-CimInstance Win32_DiskDrive | Select-Object Model,Size,InterfaceType | Export-Csv -Path \'C:\Reports\disk.csv\' -NoTypeInformation -Encoding UTF8\"

rem 全情報をまとめてJSON出力(PowerShell 5.1+)
powershell -NoProfile -Command ^
  \"@{CPU=Get-CimInstance Win32_Processor;OS=Get-CimInstance Win32_OperatingSystem} | ConvertTo-Json -Depth 3 | Out-File -FilePath \'C:\Reports\sysinfo.json\' -Encoding UTF8\"

echo PowerShellレポート完成。
endlocal

PowerShellで取得できる主な情報

  • Win32_Processor:CPUの名前・コア数・クロック周波数・ソケット数
  • Win32_PhysicalMemory:各スロットのメモリ容量・速度・製造元
  • Win32_DiskDrive:HDDやSSDのモデル・容量・インターフェース
  • Win32_OperatingSystem:OS名・ビルド番号・インストール日・最終起動時刻
  • Win32_NetworkAdapterConfiguration:IPアドレス・MACアドレス・DNSサーバー

複数PCのシステム情報を一括収集する方法(forループ活用)

社内に複数のPCがある場合、1台ずつ手動で実行するのは非効率です。バッチファイルの for ループと msinfo32 の /computer オプションを組み合わせることで、複数PC分のレポートを自動収集できます。

multi_pc_report.bat
@echo off
setlocal enabledelayedexpansion

set DIR=C:\Reports\MultiPC
if not exist %DIR% mkdir %DIR%

rem PC名リストをファイルから読み込んでループ
for /f "tokens=*" %%C in (pclist.txt) do (
    echo 収集中: %%C
    start /wait msinfo32 /computer %%C /report %DIR%\%%C_sysinfo.txt
    if %ERRORLEVEL% equ 0 (
        echo   [OK] %%C
    ) else (
        echo   [FAIL] %%C
    )
)

echo 全PC収集完了。フォルダ: %DIR%
endlocal

pclist.txt には1行1台のPC名を記述します。

pclist.txt
PC-001
PC-002
PC-003
SERVER-01

注意:リモートPCへのアクセスには、Remote Registry サービスが有効であること、ネットワーク共有への適切な権限があること、Windowsファイアウォールでの許可が必要です。ドメイン環境での管理者権限で実行してください。

タスクスケジューラへの登録方法(schtasks)

バッチファイルをタスクスケジューラに登録することで、毎日自動的にシステム情報を収集できます。schtasks コマンドを使えば、GUIを開かずにコマンドラインだけでタスクを登録・管理できます。

register_task.bat(管理者として実行)
@echo off
setlocal

rem タスク名と実行するバッチのパス
set TASKNAME=SysInfoDaily
set BATPATH=C:\Scripts\dated_report.bat

rem 毎日 AM 9:00 に実行するタスクを登録
schtasks /create ^
  /tn "%TASKNAME%" ^
  /tr "%BATPATH%" ^
  /sc DAILY ^
  /st 09:00 ^
  /ru SYSTEM ^
  /f

if %ERRORLEVEL% equ 0 (
    echo タスク登録完了: %TASKNAME%
) else (
    echo タスク登録失敗。管理者権限で実行してください。
)

endlocal

登録後の確認・削除コマンドも覚えておきましょう。

タスク管理コマンド
rem タスク一覧を確認
schtasks /query /tn SysInfoDaily

rem タスクを手動で即時実行
schtasks /run /tn SysInfoDaily

rem タスクを削除
schtasks /delete /tn SysInfoDaily /f
スイッチ 意味
/sc DAILY 毎日実行 /sc DAILY /st 09:00
/sc WEEKLY 毎週実行 /sc WEEKLY /d MON
/sc MONTHLY 毎月実行 /sc MONTHLY /d 1
/ru SYSTEM SYSTEM権限で実行 ログオフ中でも実行

収集したレポートをメール送信する(SMTP活用)

バッチファイル単体ではメール送信機能を持ちませんが、PowerShell の Send-MailMessage コマンドレットや外部ツール(blat、sendemail)を組み合わせることで、収集したレポートを自動的にメールで送信できます。

send_report_mail.bat
@echo off
setlocal

set REPORT=C:\Reports\sysinfo.txt
set MAILTO=admin@example.com
set SMTP=smtp.example.com
set FROM=sysreport@example.com

rem まずmsinfo32でレポートを生成
start /wait msinfo32 /report %REPORT%

rem PowerShellでメール送信(要: SMTPサーバー設定)
powershell -NoProfile -Command ^
  \"Send-MailMessage -To \'%MAILTO%\' -From \'%FROM%\' -Subject \'システム情報レポート\' -Body \'添付をご確認ください\' -Attachments \'%REPORT%\' -SmtpServer \'%SMTP%\'\"

if %ERRORLEVEL% equ 0 (
    echo メール送信完了。
) else (
    echo メール送信失敗。SMTPサーバーの設定を確認してください。
)

endlocal

注意:Send-MailMessage は PowerShell 7 以降で非推奨です。代替として System.Net.Mail.SmtpClient クラスや外部ライブラリの利用を検討してください。Office 365 や Gmail など認証が必要なSMTPでは、TLS設定と認証情報の指定が別途必要です。

レポートのHTML整形・比較(diff活用)

テキストレポートを比較することで、PCの状態変化(ドライバ更新・ハードウェア追加・設定変更)を検知できます。fc(File Compare)コマンドや PowerShell の Compare-Object を使った差分チェック方法を解説します。

diff_report.bat
@echo off
setlocal

set DIR=C:\Reports
set PREV=%DIR%\sysinfo_prev.txt
set CURR=%DIR%\sysinfo_curr.txt
set DIFF=%DIR%\sysinfo_diff.txt

rem 最新レポートを取得
start /wait msinfo32 /report %CURR%

rem 以前のレポートが存在すれば差分を出力
if exist %PREV% (
    echo 差分を確認中...
    fc %PREV% %CURR% > %DIFF%
    if %ERRORLEVEL% equ 0 (
        echo 変更なし。
    ) else (
        echo 変更を検出!差分ファイル: %DIFF%
    )
) else (
    echo 前回レポートなし。初回実行として記録します。
)

rem 現在のレポートを「前回」として保存
copy /y %CURR% %PREV% >nul

endlocal

さらに PowerShell を使えば HTML 形式の差分レポートを生成できます。

HTML差分レポート生成(PowerShell)
powershell -NoProfile -Command ^
  \"$prev = Get-Content \'C:\Reports\sysinfo_prev.txt\'; $curr = Get-Content \'C:\Reports\sysinfo_curr.txt\'; Compare-Object $prev $curr | ConvertTo-Html | Out-File \'C:\Reports\diff.html\' -Encoding UTF8\"

実践例:障害発生時のエビデンス収集バッチ

障害発生直後に実行することで、その時点でのシステム状態を素早くまとめて保存する「エビデンス収集バッチ」の実践例です。IT担当者やシステム管理者がすぐに使えるテンプレートです。

evidence_collect.bat
@echo off
setlocal enabledelayedexpansion

rem ===================================================
rem 障害発生時エビデンス収集バッチ
rem 実行環境: Windows 10/11、管理者権限推奨
rem ===================================================

set YYYY=%DATE:~0,4%
set MM=%DATE:~5,2%
set DD=%DATE:~8,2%
set HH=%TIME:~0,2%
set HH=%HH: =0%
set MIN=%TIME:~3,2%
set SS=%TIME:~6,2%
set STAMP=%YYYY%%MM%%DD%_%HH%%MIN%%SS%
set DIR=C:\Evidence\%STAMP%

echo エビデンス収集開始: %DIR%
mkdir %DIR%

rem (1) システム情報
echo [1/6] msinfo32...
start /wait msinfo32 /report %DIR%\msinfo32.txt

rem (2) systeminfo
echo [2/6] systeminfo...
systeminfo > %DIR%\systeminfo.txt

rem (3) 実行中プロセス
echo [3/6] tasklist...
tasklist /v > %DIR%\tasklist.txt

rem (4) ネットワーク接続状態
echo [4/6] netstat...
netstat -ano > %DIR%\netstat.txt
netstat -rn >> %DIR%\netstat.txt

rem (5) イベントログ(直近50件)
echo [5/6] event log...
powershell -NoProfile -Command ^
  \"Get-EventLog -LogName System -Newest 50 | Format-List | Out-File -FilePath \'%DIR%\eventlog.txt\' -Encoding UTF8\"

rem (6) NFOでアーカイブ保存
echo [6/6] NFOアーカイブ...
start /wait msinfo32 /nfo %DIR%\archive.nfo

echo ===========================
echo エビデンス収集完了!
echo 保存先: %DIR%
echo ===========================

pause
endlocal

収集されるエビデンスの内訳

  • msinfo32.txt:ハードウェア・ドライバ・ソフトウェア環境の詳細
  • systeminfo.txt:OS・パッチ・メモリ・CPU情報
  • tasklist.txt:実行中の全プロセスとリソース使用状況
  • netstat.txt:ネットワーク接続状態・ルーティングテーブル
  • eventlog.txt:システムイベントログ直近50件
  • archive.nfo:後から詳細確認用のNFOアーカイブ

実践例:定期インベントリ管理バッチ

社内のPC資産を定期的に記録する「インベントリ管理バッチ」です。毎月1回実行してCSVに追記することで、PC構成の変化を時系列で管理できます。

inventory.bat
@echo off
setlocal enabledelayedexpansion

set YYYY=%DATE:~0,4%
set MM=%DATE:~5,2%
set DD=%DATE:~8,2%
set STAMP=%YYYY%-%MM%-%DD%
set CSV=C:\Inventory\inventory.csv
set DIR=C:\Inventory

if not exist %DIR% mkdir %DIR%

rem CSVヘッダーを初回だけ作成
if not exist %CSV% (
    echo Date,ComputerName,OS,CPUName,TotalRAM_MB,DiskSize_GB > %CSV%
)

rem PowerShellで各情報を変数に格納してCSV追記
for /f "delims=" %%A in (\'powershell -NoProfile -Command ^
  \"$os=(Get-CimInstance Win32_OperatingSystem); ^
   $cpu=(Get-CimInstance Win32_Processor | Select -First 1); ^
   $mem=[math]::Round($os.TotalVisibleMemorySize/1KB); ^
   $disk=[math]::Round((Get-CimInstance Win32_DiskDrive | Select -First 1).Size/1GB); ^
   Write-Output \'%STAMP%,\'+$env:COMPUTERNAME+\',\'+$os.Caption+\',\'+$cpu.Name+\',\'+$mem+\',\'+$disk\"\') do (
    echo %%A >> %CSV%
)

echo インベントリを記録しました: %CSV%
endlocal

このバッチをタスクスケジューラで毎月1日に実行するよう設定すると、inventory.csv にPC情報が月次で蓄積されます。Excelで開いてグラフ化・比較分析が容易に行えます。

ポイント:インベントリCSVにPCのシリアル番号(Win32_BIOS.SerialNumber)も追加すると、ハードウェア入れ替え時の資産管理がより正確になります。Get-CimInstance Win32_BIOS | Select SerialNumber で取得できます。

まとめ

本記事では、msinfo32.exe をバッチファイルと組み合わせてシステム情報をレポート化するあらゆる手法を解説しました。最後に要点を整理します。

本記事のポイントまとめ

  • msinfo32 /report:テキスト形式で全システム情報を出力。grep・diff・メール添付に最適。
  • msinfo32 /nfo:GUI再読み込み可能なNFO形式。詳細調査・アーカイブに活用。
  • /categories:カテゴリを絞ることで出力速度と容量を最適化。
  • 日付付きファイル名%DATE%%TIME%を整形してタイムスタンプを生成。
  • systeminfo・wmic・PowerShell:用途に応じて組み合わせ、情報収集を高度化。
  • forループ:複数PCの情報を自動的に一括収集してインベントリ管理に活用。
  • schtasks:タスクスケジューラへのコマンドライン登録で完全自動化。
  • エビデンス収集:障害時に即時実行できるバッチを用意しておくと迅速な原因調査が可能。

システム管理の自動化は、一度バッチを作ってしまえば繰り返しの作業から解放されます。本記事のテンプレートをベースに、自社環境に合わせてカスタマイズして活用してください。