Windowsの性能ログ(top、df、freeコマンド)を取得してまとめる
コマンドラインでPCのメモリの状況やディスク使用率をリアルタイムで調べた上で、ログファイルをエクセルの表形式にしてまとめなる状況があったので、備忘録も兼ねてまとめておきます。
なお、説明の構成は以下の通りです。
- コマンドプロンプトでlinuxコマンド(free、df、top)を再現する
- コマンドを無限ループするバッチを作成する
- 取得したログをエクセルの表形式に変換する
1:Windows性能ログを取得するバッチ
1-1freeコマンド
Freeコマンドのバッチについては以下の通りです。
doskey free = wmic logicaldisk get size , freespace ,caption
なお、出し方自体は下記のサイトを元にしているのですが、フォーマットを変えたりメモリ情報のみを表示させたりとlinuxのfreeコマンドに近づけてはいます。
1-2dfコマンド
dfコマンドについては、既に使いやすいものが存在しているのでリンクを共有しておきます。
1-3 Topコマンド
@ echo off
:do
cls
powershell "ps | sort -d pm | Select-Object -first 10 | ft"
powershell sleep 3
goto :do
※topコマンドはPowershellを使った場合、下記のページの方法からでも可
2:無限ループを用いて性能をリアルタイムで出力する
2-1dfコマンドログ出力
バッチファイル内では自作のバッチファイルを実行するためにcallから呼び出しています
@ echo off
::######################################################################################################################################################
::# df
::######################################################################################################################################################
:do
echo "-----">>C:\\Users\\User\\Desktop\\tmp\\tsb\\df.txt
Call date_l>>C:\\Users\\User\\Desktop\\tmp\\tsb\\df.txt
Call df >>C:\\Users\\User\\Desktop\\tmp\\tsb\\df.txt
powershell sleep 30
goto :do
2-2Freeコマンドのログ出力
@ echo off
::######################################################################################################################################################
::# free
::######################################################################################################################################################
REM while true
:do
echo "-----">>C:\\Users\\User\\Desktop\\tmp\\tsb\\free.txt
Call date_l>>C:\\Users\\User\\Desktop\\tmp\\tsb\\free.txt
Call free >>C:\\Users\\User\\Desktop\\tmp\\tsb\\free.txt
powershell sleep 1
REM done > /tmp/tsb/df.txt &
goto :do
また、唐突にdate_lが出ていますが
3:ログファイル表で集計するマクロ
上記のコマンドで一通りのリアルタイムの性能ログを出すことはできるのですが、Excelの形式でまとめると見やすかったので、備忘録も兼ねてメモしておきます。
Sub make_table_fromlog()
'---------------------------------
'概要:ログテキストを表に変換する
'機能名:make_table_fromlog
'引数:なし
'戻り値:なし
'備考:
'--------------------------------
Dim row_number As Long
Dim inputcolumn As Integer
Dim komoku1_outputcolumn As Integer
Dim komoku2_outputcolumn As Integer
Dim komoku1_count As Long
Dim komoku2_count As Long
Dim inputSheet As Worksheet
Dim outputSheet As WorkSheet
Dim optional_sheet As Worksheet
Dim inputbook_name As String
Dim outputbook_name As String
Dim inputSheet_name As String
Dim outputSheet_name As String
Dim komoku1_str1 As String
Dim komoku1_str2 As String
Dim komoku2_str As String
Dim komoku_str_Array() As String
Dim komoku1_flg As String
'整形途中の文字列の一時保存
Dim tmpstr As String
Set optional_sheet = Worksheets("Sheet1")
'3Dのセルを参照(3Dにシート名を入力する)
inputbook_name = optional_sheet.Cells(3,4).Value
'4Dのセルを参照(4Dにシート名を入力する)
inputsheet_name = optional_sheet.Cells(4,4).Value
'6Dのセルを参照(6Dにシート名を入力する)
outputbook_name = optional_sheet.Cells(6,4).Value
'7Dのセルを参照(7Dにシート名を入力する)
outputsheet_name = optional_sheet.Cells(7,4).Value
If(inputbook_name<>"") Then
Set inputsheet = Workbooks(inputbook_name).Worksheets(inputsheet_name)
Else
Set inputsheet = ThisWorkbook.Worksheets(inputsheet_name)
End If
If(outputbook_name<>"") Then
Set outputsheet = Workbooks(outputbook_name).Worksheets(outputsheet_name)
Else
Set outputsheet = ThisWorkbook.Worksheets(outputsheet_name)
End If
'項目の検索対象文字列データ(最初の文字を記載すること)
' 8Dのセルを参照( 8Dに項目1の検索対象文字列を入力する)
komoku1_str1 = optional_sheet.Cells(8,4).Value
’komoku1_str2 = optional_sheet.Cells(9,4).Value
'10Dのセルを参照(10Dに項目2の検索対象文字列を入力する)
komoku2_str = optional_sheet.Cells(11,4).Value
'転記対象の列データ
' 5Dのセルを参照( 5Dに読込対象文字列を入力する)
inputcolumn = optional_sheet.Cells(5,4).Value
' 9Dのセルを参照( 9Dに項目1の検索対象文字列を入力する)
komoku1_outputcolumn = optional_sheet.Cells(10,4).Value
'11Dのセルを参照(11Dに項目2の検索対象文字列を入力する)
komoku2_outputcolumn = optional_sheet.Cells(12,4).Value
'記載済の項目の数
komoku1_count = 1
komoku2_count = 1
'シートの最初から最後の行の数まで繰り返す
For row_number=1 To inputSheet.Cells(Rows.Count,1).end(xlup).Row
If komoku1_str2 <> "" And komoku1_flg = 1 Then
'項目1の検索文字列で始まる
If InStr(inputSheet.Cells(row_number, inputcolumn).Value, komoku1_str2) <> 0 Then
'項目1を指定した列に出力
outputsheet.Cells(komoku1_count + 1, komoku1_outputcolumn).Value = inputSheet.Cells(row_number, inputcolumn).Value
komoku1_count = komoku1_count + 1
Else: komoku1_flg = 0
End If
End If
If komoku1_str1 <> "" Then
'項目1の検索文字列で始まる
If InStr(inputSheet.Cells(row_number, inputcolumn).Value, komoku1_str1) <> 0 Then
'項目1を指定した列に出力
outputsheet.Cells(komoku1_count + 1, komoku1_outputcolumn).Value = inputSheet.Cells(row_number, inputcolumn).Value
komoku1_count = komoku1_count + 1
End If
End If
If komoku2_str <> "" Then
'項目2の検索文字列で始まる
If InStr(inputSheet.Cells(row_number, inputcolumn).Value, komoku2_str) <> 0 Then
'項目2の連続スペースをスペース一つに修正
tmpstr = Application.WorksheetFunction.Trim(inputSheet.Cells(row_number, inputcolumn).Value)
'文字列を分割して、配列に代入する
komoku_str_Array() = Split(tmpstr, " ")
' 配列の要素数の最大までループ
For yoso = 0 To UBound(komoku_str_Array())
outputsheet.Cells(komoku2_count + 1, komoku2_outputcolumn + yoso).Value = komoku_str_Array(yoso) ' 転記
Next
komoku2_count = komoku2_count + 1
End If
End If
Next row_number
End Sub
問題ページに戻る