忍者ブログ

windowsのsysteminfoコマンドの結果を整理するエクセルVBAマクロ

2024年07月21日
どの会社でもパソコンなどの情報機器は、情報漏洩のリスクがあるからちゃんと管理していると思う。
ただ、その管理のやり型がエクセルに手作業で必要事項を記入という原始的なものだったりする会社もあると思う。

今回は、windowsのコマンド systeminfoで取得した各PCの情報をエクセルで取り込むツールを作った話。




作ったとは言っても初期の初期。


まずは、コマンドについて。
PCのハードウェア情報とか知りたいなぁという理由で、検索したらスゲーよさげなコマンドを発見。それがsysteminfo。

製造元メーカーとかOSのバージョン、その他いろいろな情報を取得できてめっちゃ都合がいい。


オプションで/sを付ければ、リモートでも情報取得できるようだけど、ユーザー名とパスワードが必要なところがめんどい。これは別途試してみる。

今回は、バッチファイルにまとめて実行結果をNASに置いてもらった。



VBAの開発については、手作業は全くせずにcopilotだけを使用。

実行結果は、:区切りで項目名と値が表示される。
ソースコードを見たらsplit(文字列,":",2) となっていて、
splitで上限指定できることを初めて知った。
今まで値に区切り文字が使われていたせいでどれだけ苦労してきたか・・・。


単純に区切ってしまうと、項目名が番号だけの行が出てきてしまって
よくわからなくなるので、そういう項目は1つのセルに内容をまとめて表示することにした。

このあたりのニュアンスをCopilotがなかなか理解してくれず、
プロンプトの指定に苦戦。

ソースコードのこの部分をこうしろとか、
出力のやり方をこうしろと、具体的な例示を交えて説明すると
仕様を理解してくれる。


IPアドレスとか個別に取りたい要望とか出そうだけど、
今回はそこには手を出さず。


内容をちゃんと理解していないけど、以下ソース。
変数の定義の位置だけ自分流に修正した。


Sub ReadAndOrganizeTextFile()
    
    ' テキストファイルのパスを指定
    Dim filePath As String:    filePath = "C:\Users\yabuk\Desktop\sysInf.txt"
    
    ' FileSystemObjectの作成
    Dim fso As Object:  Set fso = CreateObject("Scripting.FileSystemObject")
    Dim ts As Object:   Set ts = fso.OpenTextFile(filePath, 1)
    
    ' 初期設定
    Dim currentCategory As String:  currentCategory = ""
    Dim lastRow As Long:            lastRow = 1
    Dim isNetworkCard As Boolean:   isNetworkCard = False
    Dim isHyperV As Boolean:        isHyperV = False
    
    Dim line As String
    Dim key As String
    Dim value As String
    
    ' テキストファイルを1行ずつ読み込み
    Do Until ts.AtEndOfStream
        line = ts.ReadLine
        
        ' 空行をスキップ
        If Trim(line) <> "" Then
            ' ネットワークカードの情報をまとめる
            If isNetworkCard And Left(line, 1) = " " Then
                Cells(lastRow, 2).value = Cells(lastRow, 2).value & vbLf & Trim(line)
            ' Hyper-Vの要件の情報をまとめる
            ElseIf isHyperV And Left(line, 1) = " " Then
                Cells(lastRow, 2).value = Cells(lastRow, 2).value & vbLf & Trim(line)
            Else
                ' 項目名と値を分割
                If InStr(line, ":") > 0 Then
                    key = Trim(Left(line, InStr(line, ":") - 1))
                    value = Trim(Mid(line, InStr(line, ":") + 1))
                    
                    ' 項目名が "[" で始まる場合
                    If Left(key, 1) = "[" Then
                        Cells(lastRow, 2).value = Cells(lastRow, 2).value & vbLf & key & vbTab & value
                    Else
                        ' 通常の項目
                        If currentCategory <> "" Then
                            lastRow = lastRow + 1
                        End If
                        Cells(lastRow, 1).value = key
                        Cells(lastRow, 2).value = value
                        currentCategory = key
                        
                        ' ネットワークカードの開始を検出
                        If key = "ネットワーク カード" Then
                            isNetworkCard = True
                        Else
                            isNetworkCard = False
                        End If
                        
                        ' Hyper-Vの要件の開始を検出
                        If key = "Hyper-V の要件" Then
                            isHyperV = True
                        Else
                            isHyperV = False
                        End If
                    End If
                End If
            End If
        End If
    Loop
    
    ts.Close
End Sub
PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字