thumbnail 一問一答の一歩

Windowsの性能ログ(top、df、freeコマンド)を取得してまとめる

コマンドラインでPCのメモリの状況やディスク使用率をリアルタイムで調べた上で、ログファイルをエクセルの表形式にしてまとめなる状況があったので、備忘録も兼ねてまとめておきます。

なお、説明の構成は以下の通りです。

  1. コマンドプロンプトでlinuxコマンド(free、df、top)を再現する
  2. コマンドを無限ループするバッチを作成する
  3. 取得したログをエクセルの表形式に変換する

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

問題ページに戻る