[PowerShell]CPUリソース、メモリリソースのチェックスクリプト

こんにちは！れーあです。
前回に引き続き、PowerShellのスクリプトの勉強をしていきます。
なお、今回は課題をChatGPTに考えてもらいました。

前回はこちら↓
[[PowerShell]大量のファイルを作成するスクリプト](https://qiita.com/Re_A/items/5c01af56a65b280bd38b)

それではどうぞ。

## 前提情報
<b> スクリプト実行環境 </b>
``` 
PS C:\Users\user> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      19041  4046
```

## スクリプト内容
では今回のスクリプトです。

<b>処理内容：
　CPU、メモリのリソース使用率を取得する。
　その後、CPUまたはメモリのどちらかの使用率が80%以上であれば
 　エラーメッセージを表示、そうでなければ正常メッセージを表示させて
  　その内容をログファイルに出力する。</b>

```PowerShell
# CPUとメモリの使用率を取得
$CPUUsage = Get-WmiObject win32_processor | Measure-Object -Property LoadPercentage -Average | Select-Object -ExpandProperty Average
$OS = Get-WmiObject win32_operatingsystem
$FreeMemory = [math]::Round(($OS.FreePhysicalMemory / 1MB), 2)
$TotalMemory = [math]::Round(($OS.TotalVisibleMemorySize / 1MB), 2)
$MemoryUsage = [math]::Round((($TotalMemory - $FreeMemory) / $TotalMemory) * 100, 2)

# 使用率が80%を超えているか確認。超過ならエラーメッセージ、そうでないなら正常メッセージをログファイルに出力する
$logPath = "C:\Users\user\Desktop\logFile.log"

if ($CPUUsage -gt 80 -or $MemoryUsage -gt 80){
	$message = "Warning: resouce usage is high. CPU usage $CPUUsage%, Memory usage $MemoryUsage%"

	# 警告メッセージを表示
	Write-Host $message

	# ログファイルに警告メッセージと現在時刻記載
	$logMessage = "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss"): $message"
	Add-Content -Path $logPath -Value $logMessage
} else {
	$message = "All Normality. CPU resouce: $CPUUsage%, Memory resouce $MemoryUsage%"

	# 正常メッセージを表示
	Write-Host $message

	# ログファイルに正常メッセージと現在時刻記載
	$logMessage = "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss"): $message"
	Add-Content -Path $logPath -Value $logMessage
}

Write-Host "Script Finished"
```

## 使用コマンドレット説明
- <b> $CPUUsage = Get-WmiObject win32_processor | Measure-Object -Property LoadPercentage -Average | Select-Object -ExpandProperty Average </b>

長いですが、上記コマンドレットでCPUリソースを取得します。
「Get-WmiObject win32_processor」でCPU情報を取得、「Measure-Object」でそれらの項目を計算、「Select-Object」でそのうちのどれを使用するかを選択します。
<br>
- <b> $OS = Get-WmiObject win32_operatingsystem </b>
- <b>＄FreeMemory = [math]::Round(($OS.FreePhysicalMemory / 1MB), 2) </b>
- <b>＄TotalMemory = [math]::Round(($OS.TotalVisibleMemorySize / 1MB), 2)</b>
- <b>＄MemoryUsage = [math]::Round(((＄TotalMemory - ＄FreeMemory) / $TotalMemory) * 100, 2)
 </b>

上記でメモリリソースを取得します。
「win32_operatingsystem」ではOSの情報を取得します。
メモリの情報というのはどうやらこのOSの情報に含まれているようでしたので、こちらで取得します。
その後、整形をします。「[math]::Round」では四捨五入をしてわかりやすい形で数値を変換します。
<br>

- <b> Add-Content -Path ＄logPath -Value ＄logMessage </b>
上記では指定したファイルに指定した値を記載します。
今回ではエラーメッセージまたは正常メッセージを出力しています。
<br>

そのほかのIf文や「Write-Host」などは
個人的に重要度が高くないため、省略します。

## 実際に動かしてみた
では、実際に動かしてみます。
今回は「C:\Users\user\Desktop\logFile.log」というログファイルに結果を出力します。変更も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632150/ffc0e60f-0402-adf9-56bf-6756a483769c.png)
<br>

対象ファイルを右クリックして、「PowerShellで実行」で動かします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632150/a0b3465a-58cc-afd9-d8a8-c39e30e5d607.png)
<br>

一瞬PowerShellが開いた後、デスクトップ上に「logFile.log」が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632150/e86f8e5b-add4-80df-856e-1e875957f272.png)
<br>

中身を確認すると、CPU、メモリともに80%以上ではないため、正常メッセージが出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632150/0d343cf4-5187-e414-dbd7-9ce1365a0a39.png)

正常に出力されていましたね。

ちなみに、しきい値を20%にして再実行してみると、想定通りエラーメッセージが出力されていました。エラー時も正常に動作するようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632150/e5bc8218-b3d2-c3e0-c40a-d1dc5d436818.png)
<br>

## おわりに
というわけで今回はCPUリソース、メモリリソースのチェックを行うスクリプトを作成しました。
実際仕事ではなかなか自作でCPU、メモリのリソースチェックを行うことはないでしょうが、どのように動作するかは今回ので勉強することができたので、ある程度スムーズに触れるようになったのではないかと考えています。

## 参考
[WMIクラス - learn.microsoft.com](https://learn.microsoft.com/ja-jp/windows/win32/wmisdk/wmi-classes)
[win32_processor - learn.microsoft.com](https://learn.microsoft.com/ja-jp/windows/win32/cimwin32prov/win32-processor)
[win32_operatingsystem - learn.microsoft.com](https://learn.microsoft.com/ja-jp/windows/win32/cimwin32prov/win32-operatingsystem)


[Get-WmiObject - learn.microsoft.com](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/get-wmiobject?view=powershell-5.1)
[Measure-Object - learn.microsoft.com](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/measure-object?view=powershell-5.1)
[Select-Object - learn.microsoft.com](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/select-object?view=powershell-5.1)
[Add-Content - learn.microsoft.com](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/add-content?view=powershell-5.1)
[Get-Date - learn.microsoft.com](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/get-date?view=powershell-5.1)

「[math]::Round」だけは公式ドキュメントみてもよくわからなかったので下記を参考にさせていただきました。
https://step-learn.com/article/powershell/034-number-round.html