windowsのsysteminfoコマンドの結果を整理するエクセルVBAマクロ
2024年07月21日
どの会社でもパソコンなどの情報機器は、情報漏洩のリスクがあるからちゃんと管理していると思う。
ただ、その管理のやり型がエクセルに手作業で必要事項を記入という原始的なものだったりする会社もあると思う。
今回は、windowsのコマンド systeminfoで取得した各PCの情報をエクセルで取り込むツールを作った話。
ただ、その管理のやり型がエクセルに手作業で必要事項を記入という原始的なものだったりする会社もあると思う。
今回は、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