株式会社Good Labでエンジニアをしている コータロー です。
日々、Java・SQL・Gitなどの技術情報や、新人エンジニア向けの学習ノウハウ、
AI活用についての情報を発信しています。
Good Labについて気になった方は、コーポレートサイトもぜひご覧ください。
▶コーポレートサイト
本記事は 「PowerShell 業務自動化レシピ」 シリーズの第8回です。このシリーズは、文法解説ではなく 「1記事=1つの業務課題」を、コピペで動く検証済みスクリプトで解決することを目的とした実務レシピ集です(全12回想定)。SES・受託・社内運用の現場で、いまだに手作業でやっている地味な作業を片っ端から自動化していきます。
第7回 では「ログファイルからエラーを抽出して日次レポート化」を扱いました。集めた情報を1枚のレポートにまとめる、という流れは今回も共通です。第8回はその対象を サーバの状態 に広げます。
第8回のテーマは 「サーバの死活・ディスク容量・サービス状態をまとめて点検」。複数サーバに Test-Connection でpingして生きているか確認し、Get-CimInstance でCドライブの空き容量を確認し、Get-Service で重要サービスが起動しているかを確認する——この「朝の運用点検」を1スクリプトにまとめ、結果を一覧表+CSVに出し、異常だけ色付けで目立たせるところまでやります。
本記事は PowerShell 7(pwsh、クロスプラットフォーム) を基準にしています。Windows標準の Windows PowerShell 5.1 での差異は、各所と最後の章で明記します。
Test-Connectionは 5.1と7でパラメータ名・戻り値の型が違うため、今回は特にこの差異を丁寧に扱います。
今回は 読み取り(点検)+CSV出力のみ で、サーバの設定やサービスを変更したりはしません(破壊的操作なし)。ただし、リモートのサーバを対象にする場合は権限・ファイアウォール・WinRMが絡みます(後述)。
Before:手作業のつらいシーン
シーン1:朝イチで複数サーバに1台ずつ ping
「出社したら、まず本番・検証の各サーバが生きているか確認して」。コマンドプロンプトを開いて、ping web01、ping web02、ping db01… とサーバ名を打ち替えながら1台ずつ。返ってくる4行を目で見て「OKっぽい」と判断。
- サーバが10台あれば、
pingを10回打って、10回とも結果を目視 - 「応答なし」を見落とすと、午後に「サイトが落ちてる」と言われて初めて気づく
- 体感 10〜15分、しかも集中力が要るわりに結果はどこにも残らない
シーン2:ディスク容量とサービス起動をリモートデスクトップで目視
次に、各サーバにリモートデスクトップでログインして、エクスプローラーでCドライブのプロパティを開いて空き容量を確認。さらに「サービス」管理ツールを開いて、対象サービス(例:W3SVC、MSSQLSERVER)が「実行中」かを目で確認。
- 1台あたり「RDP接続 → ディスク確認 → サービス確認 → ログアウト」で数分
- 10台で 30〜40分。空き容量が「残り5%」みたいな危険水域を、数字を見比べて気づくのは至難
- 確認した結果は、せいぜいExcelに手で転記。記録が残らないと「いつから減っていたか」も追えない
これ、全サーバへの一括ping → ディスク空き容量チェック(閾値割れを警告)→ 重要サービスの起動確認 → 1枚の点検レポート(CSV+色付きコンソール表) まで、スクリプト一本で終わります。
After:スクリプト一本で完了
進め方は ①複数ホストへ一括ping死活確認 → ②ディスク空き容量チェック(閾値割れを警告)→ ③重要サービスの起動状態確認 → ④全結果を1枚の点検レポートにまとめて異常だけ色付け の順です。
この記事では、点検対象のサーバ名をこう持っている前提で進めます(ローカル1台で試すなら "localhost" だけでも動きます)。
# 点検対象のホスト名(IPでも可)
$hosts = "web01", "web02", "db01"
レシピ1:複数ホストへ一括pingで死活確認する
まずは死活確認だけ。各ホストに 2回ずつ ping し、-Quiet で「生きているか(真偽)」だけを受け取ります。-Quiet は「1回でも応答が返れば $true、全部失敗なら $false」を返します。
# ===== 設定 =====
$hosts = "web01", "web02", "db01" # 点検対象ホスト
$count = 2 # 1ホストあたりのping回数
# ===== 本体 =====
$pingResult = foreach ($h in $hosts) {
# -Quiet は「1回でも応答すれば $true」を返す(PowerShell 7)
$alive = Test-Connection -TargetName $h -Count $count -Quiet -TimeoutSeconds 2
[pscustomobject]@{
Host = $h
Alive = $alive
}
}
$pingResult | Format-Table -AutoSize
出力イメージ(db01 だけ落ちている想定):
Host Alive
---- -----
web01 True
web02 True
db01 False
⚠️ ここが今回いちばんの落とし穴です。
Test-Connectionのパラメータ名はPowerShell 7と5.1で違います。7は-TargetName、5.1は-ComputerNameです(7では-ComputerNameはエイリアスとして残っていますが、5.1では-TargetNameは使えません)。両対応にする方法は要点解説で扱います。
応答時間(レイテンシ)まで見たいときは、-Quiet を外すと1回のpingごとに1オブジェクトが返ります。7では各オブジェクトに Status(Success / TimedOut)と Latency(ミリ秒)が入っています。
# 応答時間まで見る(-Quiet なし、PowerShell 7)
Test-Connection -TargetName "web01" -Count 2 |
Select-Object Status, Latency, Address |
Format-Table -AutoSize
Status Latency Address
------ ------- -------
Success 1 10.0.0.11
Success 2 10.0.0.11
Latencyの単位はミリ秒です。5.1では戻り値の型・プロパティ名が違い、応答時間はResponseTimeという名前です(後述の差異表参照)。
レシピ2:ディスク空き容量をチェックして閾値割れを警告する
Get-CimInstance で Win32_LogicalDisk を取得し、Cドライブの空き容量を確認します。空き容量が閾値(例:20%)を下回ったら警告を立てます。
# ===== 設定 =====
$driveLetter = "C:" # チェックするドライブ
$warnPercent = 20 # 空き容量がこの%未満なら警告
# ===== 本体 =====
# DriveType=3 は「ローカルディスク」(CD/ネットワークドライブを除外)
$disk = Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DeviceID='$driveLetter'"
# バイト → GB は /1GB(PowerShell の組み込み単位)
$totalGB = [math]::Round($disk.Size / 1GB, 1)
$freeGB = [math]::Round($disk.FreeSpace / 1GB, 1)
$freePct = [math]::Round($disk.FreeSpace / $disk.Size * 100, 1)
[pscustomobject]@{
Drive = $driveLetter
TotalGB = $totalGB
FreeGB = $freeGB
FreePct = $freePct
Warn = ($freePct -lt $warnPercent) # 閾値を下回ったら $true
} | Format-Table -AutoSize
出力イメージ(残り 8.2%・空きが少ない想定):
Drive TotalGB FreeGB FreePct Warn
----- ------- ------ ------- ----
C: 237.9 19.5 8.2 True
1GBは PowerShell の組み込みリテラルで1073741824(=1024×1024×1024 バイト)を意味します。$disk.FreeSpace(バイト)を/1GBするだけでGB換算できます。/1MB/1TBも同様に使えます。FreePctが8.2(閾値20%未満)なのでWarnがTrueになっています。
全ドライブをまとめて見たいときは -Filter を外し、DriveType=3(ローカルディスク)で絞ります。
# ローカルディスクを全部チェック(DriveType=3 だけ)
Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3" |
Select-Object `
@{Name='Drive'; Expression={ $_.DeviceID }},
@{Name='TotalGB'; Expression={ [math]::Round($_.Size / 1GB, 1) }},
@{Name='FreeGB'; Expression={ [math]::Round($_.FreeSpace / 1GB, 1) }},
@{Name='FreePct'; Expression={ [math]::Round($_.FreeSpace / $_.Size * 100, 1) }} |
Format-Table -AutoSize
Drive TotalGB FreeGB FreePct
----- ------- ------ -------
C: 237.9 19.5 8.2
D: 931.5 610.3 65.5
レシピ3:重要サービスの起動状態を確認する
Get-Service で、点検対象のサービスが起動しているかを確認します。サービスには「表示名」と「サービス名」があり、Get-Service は -Name(サービス名) で指定するのが確実です(例:IIS は表示名「World Wide Web 発行サービス」、サービス名は W3SVC)。
# ===== 設定 =====
# 確認したいサービス名(表示名ではなくサービス名)
$serviceNames = "W3SVC", "MSSQLSERVER", "Spooler"
# ===== 本体 =====
$svcResult = foreach ($name in $serviceNames) {
# 存在しないサービス名でエラーを出さないよう -ErrorAction SilentlyContinue
$svc = Get-Service -Name $name -ErrorAction SilentlyContinue
if ($null -eq $svc) {
# サービス自体が見つからない(名前違い or 未インストール)
[pscustomobject]@{
Service = $name
Status = "NotFound"
Running = $false
}
}
else {
[pscustomobject]@{
Service = $svc.Name
Status = $svc.Status # Running / Stopped など
Running = ($svc.Status -eq 'Running')
}
}
}
$svcResult | Format-Table -AutoSize
出力イメージ(MSSQLSERVER が停止している想定):
Service Status Running
------- ------ -------
W3SVC Running True
MSSQLSERVER Stopped False
Spooler Running True
Get-ServiceのStatusは文字列ではなく[System.ServiceProcess.ServiceControllerStatus]という列挙型ですが、-eq 'Running'のように文字列と比較すると期待どおり判定できます。Running(実行中)以外にStopped(停止)、StartPending(起動中)、Paused(一時停止)などがあります。
レシピ4:全結果を1枚の点検レポートにまとめて異常だけ色付け表示する
最後に、レシピ1〜3を 1スクリプトに統合 します。全サーバについて「死活・ディスク・サービス」を点検し、結果を1枚のオブジェクト配列にまとめて、CSV保存+コンソールに色付き表示します。色付けには Write-Host -ForegroundColor を使い、異常な行だけ赤 にします。
ここでは、各サーバの情報をリモートで取りに行く構成にしています(Get-CimInstance は -ComputerName、Get-Service は Invoke-Command 経由)。ローカル1台で試す場合の注意は直後に書きます。
# ===== 設定 =====
$hosts = "web01", "web02", "db01" # 点検対象ホスト
$count = 2 # ping回数
$driveLetter = "C:" # 容量チェック対象ドライブ
$warnPercent = 20 # 空き容量がこの%未満なら警告
$serviceNames = "W3SVC", "Spooler" # 各サーバで起動を確認するサービス
$stamp = Get-Date -Format "yyyyMMdd_HHmmss"
$outCsv = "C:\ops\health_$stamp.csv" # レポートCSVの出力先
# ===== 本体:1サーバずつ点検 =====
$report = foreach ($h in $hosts) {
# --- ① 死活 ---
$alive = Test-Connection -TargetName $h -Count $count -Quiet -TimeoutSeconds 2
# 落ちているサーバはディスク・サービス取得を試みても無駄なのでスキップ
if (-not $alive) {
[pscustomobject]@{
Host = $h
Alive = $false
FreeGB = $null
FreePct = $null
DiskNG = $true
SvcNG = $true
Note = "ping応答なし"
}
continue
}
# --- ② ディスク(リモート) ---
$disk = Get-CimInstance -ClassName Win32_LogicalDisk `
-Filter "DeviceID='$driveLetter'" -ComputerName $h -ErrorAction SilentlyContinue
$freeGB = if ($disk) { [math]::Round($disk.FreeSpace / 1GB, 1) } else { $null }
$freePct = if ($disk) { [math]::Round($disk.FreeSpace / $disk.Size * 100, 1) } else { $null }
$diskNG = if ($disk) { $freePct -lt $warnPercent } else { $true }
# --- ③ サービス(リモート:Invoke-Command 経由) ---
$stopped = Invoke-Command -ComputerName $h -ScriptBlock {
param($names)
foreach ($n in $names) {
$s = Get-Service -Name $n -ErrorAction SilentlyContinue
if ($null -eq $s -or $s.Status -ne 'Running') { $n } # 起動していないサービス名を返す
}
} -ArgumentList (,$serviceNames) -ErrorAction SilentlyContinue
$svcNG = [bool]$stopped # 起動していないサービスが1つでもあれば $true
[pscustomobject]@{
Host = $h
Alive = $true
FreeGB = $freeGB
FreePct = $freePct
DiskNG = $diskNG
SvcNG = $svcNG
Note = if ($stopped) { "停止: $($stopped -join ',')" } else { "" }
}
}
# ===== CSVへ保存 =====
New-Item -ItemType Directory -Path (Split-Path $outCsv) -Force | Out-Null
$report | Export-Csv -LiteralPath $outCsv -Encoding UTF8BOM -NoTypeInformation
# ===== コンソールに色付き表示(異常行は赤) =====
Write-Host ""
Write-Host ("{0,-8} {1,-6} {2,-8} {3,-8} {4}" -f "Host", "Alive", "FreePct", "Disk", "Service") -ForegroundColor Cyan
Write-Host ("-" * 50) -ForegroundColor DarkGray
foreach ($r in $report) {
# 1項目でも異常なら赤、すべて正常なら緑
$isNG = (-not $r.Alive) -or $r.DiskNG -or $r.SvcNG
$color = if ($isNG) { "Red" } else { "Green" }
$line = "{0,-8} {1,-6} {2,-8} {3,-8} {4}" -f `
$r.Host,
$r.Alive,
($(if ($null -ne $r.FreePct) { "$($r.FreePct)%" } else { "-" })),
($(if ($r.DiskNG) { "NG" } else { "OK" })),
($(if ($r.SvcNG) { "NG $($r.Note)" } else { "OK" }))
Write-Host $line -ForegroundColor $color
}
Write-Host ""
Write-Host "レポート出力: $outCsv" -ForegroundColor Cyan
コンソール出力イメージ(web01 正常/web02 はディスク逼迫+サービス停止/db01 はping応答なし):
Host Alive FreePct Disk Service
--------------------------------------------------
web01 True 65.5% OK OK
web02 True 8.2% NG NG 停止: W3SVC
db01 False - NG NG
レポート出力: C:\ops\health_20260630_090000.csv
上の表のうち、
web01の行は緑、web02とdb01の行は赤で表示されます(Qiita上では色は再現されませんが、実コンソールでは異常行が一目で分かります)。同時にCSVも残るので、毎朝同じスクリプトを回せばいつから空き容量が減り始めたかを後から追えます。
出力された health_20260630_090000.csv の中身:
Host,Alive,FreeGB,FreePct,DiskNG,SvcNG,Note
web01,True,155.8,65.5,False,False,
web02,True,19.5,8.2,True,True,停止: W3SVC
db01,False,,,True,True,ping応答なし
ローカル1台だけで試したいときは、
$hosts = "localhost"にし、ディスク取得から-ComputerName $hを外し(ローカル取得)、サービスはInvoke-Commandを使わずGet-Serviceを直接呼ぶ形に変えてください。リモート(-ComputerName/Invoke-Command)は WinRM の設定や管理者権限が前提 になります(後述の注意点参照)。
コードの要点解説(なぜこの書き方か)
文法そのものではなく、現場でハマらないための選択を中心に解説します。
1. 【最重要】Test-Connection はPS7と5.1でパラメータ名・戻り値が違う
今回いちばんの落とし穴です。Test-Connection は PowerShell 7と5.1で仕様が変わっています。
| PowerShell 7(pwsh) | Windows PowerShell 5.1 | |
|---|---|---|
| 対象ホストの指定 |
-TargetName(-ComputerName はエイリアス) |
-ComputerName のみ(-TargetName は不可) |
-Quiet の戻り値 |
[bool](1回でも応答すれば $true) |
[bool](同じく真偽を返す) |
| 既定の戻りオブジェクト | TestConnectionCommand+PingStatus |
Win32_PingStatus(WMI) |
| 応答時間のプロパティ |
Latency(ミリ秒) |
ResponseTime(ミリ秒) |
| タイムアウト指定 |
-TimeoutSeconds(秒) |
なし(-TimeToLive 等はあるが用途が違う) |
-Quiet で真偽だけ受け取るぶんには、-TargetName を -ComputerName に置き換えれば5.1でもそのまま動きます。両バージョンで同じスクリプトを使い回したいなら、バージョンで分岐させます。
# PS7 / 5.1 両対応で「生きているか」を真偽で返す関数
function Test-Alive {
param([string]$ComputerName, [int]$Count = 2)
if ($PSVersionTable.PSVersion.Major -ge 6) {
# PowerShell 6+/7:-TargetName
Test-Connection -TargetName $ComputerName -Count $Count -Quiet -TimeoutSeconds 2
}
else {
# Windows PowerShell 5.1:-ComputerName
Test-Connection -ComputerName $ComputerName -Count $Count -Quiet
}
}
Test-Alive -ComputerName "web01" # → True / False
$PSVersionTable.PSVersion.Major で実行中のメジャーバージョンを判定できます(7なら 7、Windows PowerShellなら 5)。
2. Get-WmiObject は使わず Get-CimInstance を使う
ディスク容量の取得でよく見る Get-WmiObject Win32_LogicalDisk は、PowerShell 3.0以降 Get-CimInstance が推奨で、Get-WmiObject はPowerShell 7では削除されています(5.1には残っていますが非推奨)。クラス名(Win32_LogicalDisk)やプロパティ(Size / FreeSpace)は同じなので、Get-CimInstance -ClassName Win32_LogicalDisk に置き換えるだけです。今後の環境差を避けるためにも、新規に書くなら Get-CimInstance に統一しておくのが安全です。
3. バイト → GB は /1GB、DriveType=3 でローカルディスクに絞る
Win32_LogicalDisk の Size / FreeSpace はバイト単位です。/1GB(PowerShell組み込みの 1073741824)で割ればGBになります。割り切れない端数は [math]::Round(値, 1) で小数1桁に丸めると読みやすくなります。
また Win32_LogicalDisk には CD/DVD やネットワークドライブも含まれるため、-Filter "DriveType=3" でローカルの固定ディスクだけに絞っています(DriveType=3 が固定ディスク、5 がCD-ROM、4 がネットワークドライブ)。-Filter はWMIクエリ側で絞り込むので、取得後に Where-Object するより効率的です。
4. Get-Service はサービス名(-Name)で確認、存在しない場合に備える
サービスには「表示名(DisplayName)」と「サービス名(Name)」があります。表示名は環境(言語)で変わることがあるので、スクリプトでは -Name(サービス名)で指定するのが確実です(IIS=W3SVC、印刷スプーラー=Spooler など)。
指定したサービスが存在しないと Get-Service はエラーを出すので、-ErrorAction SilentlyContinue でエラーを抑え、$null チェックで「未インストール/名前違い」を NotFound として扱っています。Status -eq 'Running' で起動判定するのが基本形です。
5. Get-Service はローカル既定。リモートは Invoke-Command で
Get-Service は 既定でローカルマシンのサービスを見ます。Windows PowerShell 5.1には Get-Service -ComputerName がありましたが、PowerShell 7では -ComputerName が廃止されています。そのため7でリモートのサービスを見るには、Invoke-Command -ComputerName <host> -ScriptBlock { Get-Service ... } のように リモート側でコマンドを実行するのが標準的な方法です(WinRMが前提)。レシピ4ではこの形で、リモート側で「起動していないサービス名」だけを返させています。
6. 異常だけ色付けは Write-Host -ForegroundColor
一覧表示で「異常がどこか」を一瞬で分からせるには、Write-Host -ForegroundColor Red(異常)/ Green(正常)が手軽です。Format-Table は行ごとに色を変えられないので、1行ずつ Write-Host で書き出して色を切り替えています。"{0,-8}" のような書式(-f 演算子)で左詰め8文字に揃えると、色付きでも列がガタつきません。なお Write-Host は画面表示専用でパイプラインに値を流さないため、データはCSV(Export-Csv)に残し、表示は Write-Host と役割を分けています。
応用・注意点
① リモート点検には「権限・ファイアウォール・WinRM」が要る
レシピ4のように他サーバを -ComputerName / Invoke-Command で点検するには、前提条件があります。
- 管理者権限:相手サーバの管理者権限を持つアカウントで実行する(PowerShellを「管理者として実行」)
-
WinRM(PowerShellリモート処理):
Invoke-CommandはWinRM経由。対象サーバでEnable-PSRemoting済みであること -
ファイアウォール:
Get-CimInstance -ComputerName(DCOM/WMI)や WinRM(既定 TCP 5985)が許可されていること
社内のドメイン環境なら整っていることが多いですが、検証環境や個別サーバでは塞がれていることもあります。Invoke-Command がエラーになる場合、まずは1台に対して Test-WSMan -ComputerName web01 でWinRMが応答するか確認すると切り分けが早いです。ローカル1台の点検なら、これらは一切不要です(レシピ1〜3の単体版)。
② 落ちているサーバへの取得は早めに打ち切る
レシピ4では、pingに応答しないサーバは continue でディスク・サービス取得をスキップしています。応答しないサーバに Get-CimInstance -ComputerName を投げると、タイムアウトまで待たされてスクリプト全体が遅くなるためです。「死活NGなら以降はNG扱いで即次へ」が、台数が増えたときの体感速度に効きます。
③ 空き容量の「警告」は割合と実容量の両方で見る
「空き20%未満で警告」はシンプルですが、巨大ディスクだと20%でも実容量は十分(例:4TBの20%=800GB)なこともあります。逆に小容量ディスクは割合に余裕があっても危ないことも。実務では「割合 FreePct が閾値未満 または 実空き FreeGB が一定値未満」のように、両方で判定すると事故りにくいです。
# 「20%未満」または「空き10GB未満」のどちらかで警告
$diskNG = ($freePct -lt 20) -or ($freeGB -lt 10)
④ サービスの「起動しているべき一覧」はサーバごとに違う
Webサーバでは W3SVC、DBサーバでは MSSQLSERVER、というように、確認すべきサービスはサーバの役割で変わります。$serviceNames をサーバ名と対応づけて持っておくと、役割別に点検できます。
# サーバごとに確認するサービスを変える
$serviceMap = @{
"web01" = @("W3SVC", "Spooler")
"db01" = @("MSSQLSERVER")
}
# 使うとき:$serviceMap["web01"] → @("W3SVC","Spooler")
ハッシュテーブル(@{ })でサーバ名→サービス名配列を引けるようにしておくと、レシピ4の $serviceNames をサーバごとに差し替えるだけで対応できます。
⑤ 定期実行(タスクスケジューラ)で「毎朝自動点検」にする
このスクリプトを .ps1 ファイルに保存し、タスクスケジューラで毎朝実行すれば、出社前に点検レポートCSVが出来上がっています。異常があったらメール通知したい——という発展は、まさに次回の Invoke-RestMethod(や Send-MailMessage 後継)につながります。
# タスクスケジューラに登録する「操作」の例
プログラム: pwsh.exe
引数: -NoProfile -ExecutionPolicy Bypass -File "C:\ops\health_check.ps1"
PowerShell 7(
pwsh.exe)で登録する点に注意。Windows PowerShell 5.1で動かすならpowershell.exeを指定します。-NoProfileでプロファイル読み込みをスキップすると起動が速く、環境差の影響も減ります。
⑥ Windows PowerShell 5.1 との差異
本記事のスクリプトは、ディスク(Get-CimInstance)とサービス(Get-Service 単体)のコア部分は 5.1 でもそのまま動作します。違いが大きいのは Test-Connection とリモート系です。
| 項目 | PowerShell 7(pwsh) | Windows PowerShell 5.1 |
|---|---|---|
Test-Connection のホスト指定 |
-TargetName(-ComputerName はエイリアス) |
-ComputerName(-TargetName 不可) |
Test-Connection 既定の戻り |
TestConnectionCommand+PingStatus(Latency) |
Win32_PingStatus(ResponseTime) |
Test-Connection -TimeoutSeconds |
あり | なし |
Get-WmiObject |
削除(Get-CimInstance を使う) |
あり(ただし非推奨。Get-CimInstance 推奨) |
Get-CimInstance |
あり | あり(共通で使える) |
Get-Service -ComputerName(リモート) |
廃止(Invoke-Command 経由にする) |
あり(直接リモート指定可) |
Export-Csv -Encoding UTF8BOM |
利用可 | 指定不可(値が存在しない/第3・4回参照) |
-NoTypeInformation |
既定で型情報行は付かない(付けても無害) |
付けないと #TYPE ... 行が入る → 付けるのが必須 |
Get-CimInstance はどちらでも使えるので、ディスク容量チェックは共通化しやすい部分です。一方で Test-Connection のパラメータ名と、Get-Service のリモート方法はバージョンで明確に分岐させる必要があります。両対応の死活確認は要点解説1の Test-Alive 関数を使うのが手堅いです。CSV出力のエンコードまわり(UTF8BOM が5.1で使えない件)は、第3・4回で扱った [System.IO.File]::WriteAllLines + UTF8Encoding($true) で代替できます。
まとめ
- 死活確認は
Test-Connection。7は-TargetName、5.1は-ComputerName(最重要の差異)。-Quietで真偽だけ取得 - ディスク容量は
Get-CimInstance Win32_LogicalDisk(Get-WmiObjectは使わない)。バイト→GBは/1GB、ローカル固定ディスクはDriveType=3 - サービス起動は
Get-Service -Name(サービス名で指定)、Status -eq 'Running'で判定。リモートは7ではInvoke-Command経由 - 全結果を
[pscustomobject]でまとめ、Export-Csvで記録+Write-Host -ForegroundColorで異常行だけ色付け - リモート点検は 権限・ファイアウォール・WinRM が前提。ローカル1台なら不要
- 5.1差異は
Test-Connection(パラメータ・戻り値)/Get-Serviceのリモート方法/CSVエンコードに集中。Get-CimInstanceは共通で使える
これで、毎朝30〜40分かけていた「pingして、ディスク見て、サービス確認して」が、コマンド一本・数十秒で、しかも記録(CSV)と警告(色付け)つきで再現できるようになります。
次回 第9回は「REST APIからデータ取得してCSV/通知に流す」。Invoke-RestMethod でWeb APIからJSONを取得し、必要な項目を抜き出してCSV化したり、Webhookへ通知を飛ばしたりするレシピを扱います。今回の点検結果を「異常時だけ通知」する発展にもつながります。お楽しみに。
参考
- Test-Connection (Microsoft.PowerShell.Management) - Microsoft Learn
- Get-CimInstance (CimCmdlets) - Microsoft Learn
- Get-Service (Microsoft.PowerShell.Management) - Microsoft Learn
- Invoke-Command (Microsoft.PowerShell.Core) - Microsoft Learn
- Write-Host (Microsoft.PowerShell.Utility) - Microsoft Learn
- about_Remote_Requirements (PowerShell) - Microsoft Learn
- Win32_LogicalDisk class - Microsoft Learn
@kotaro_ai_lab
AI活用や開発効率化について発信しています。フォローお気軽にどうぞ!