概要
ある日、サーバのドライブが空き容量ゼロになり、本番システムが一部停止してしまう。
管理しているサーバすべてのドライブ空き容量が残りわずかになっていないか
毎日確認してくださいと指示されてしまう。
毎日は面倒 単純作業PCにやらせたいと考え、自動化に至る・・・
補足
自動化で有名な言語として Python があげられるが、
Python のインストール作業する手間があるため、
最近のWindowsOSでは標準装備となっている PowerShell を使用することに決めた。
前提
PowerShellのバージョンは、5.1 です。
PS D:\> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.19041.5129
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.19041.5129
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
PowerShellコマンド
daily-drive-check.ps1
# 配列で対象とするPCを指定
$PCLIST = @(
# 対象にしたいPC名またはIPアドレスを指定してください。
"","",""
);
# 対象サーバ一覧の分だけループ・・・
foreach($str in $PCLIST){
#リモート先PC接続とドライブ取得
$result = Invoke-Command -ComputerName $str -ScriptBlock {
# 検索対象のドライブを取得(DVDマウントされてるものは除外)
$drives = Get-PSDrive -PSProvider FileSystem | Where-Object { $_.Used -ne $null -and $_.Free -ne $null }
foreach($drive in $drives){
$freeSpaceGB = [math]::round($drive.Free / 1GB, 2);
if ($freeSpaceGB -le 5) {
# 空き容量が5GB以下の場合に警告を表示
$result = ($result + "`r`n 警告: " + "${drive}ドライブの空き容量が残り ${freeSpaceGB} [GB] です!");
} else {
# 空き容量が5GBより多い場合
$result = ($result + "${drive}ドライブ: ${freeSpaceGB} [GB]`t");
}
}
# Invoke-Commandの中ではスコープが隔離されるので、returnで渡すことになる。
return $result;
}
}
メール送信コマンド
daily-drive-check.ps1
#メール送信用のパラメータ定義
$MailParam = @{
SmtpServer = $SmtpServer;
port = $port;
From = $from;
To = $to;
Subject = $subject;
Body = $body;
Encoding = [System.Text.Encoding]::UTF8;
}
#メール送信
Send-MailMessage @MailParam;
タスクスケジューラに設定
バッチファイルと比べて少し面倒だった。
操作:プログラムの開始
プログラム/スクリプト:(powershell.exeの絶対パス)
引数の追加:-Command "(作ったps1の絶対パス)" ※ダブルクオーテーションで囲む
powerShellのウィンドウを非表示にしたい場合:
セキュリティ オプション
「ユーザーがログオンしているかどうかにかかわらず実行する」を選択する。
結果
とりあえず出社時間の10分後くらいに自動で実行するように
自PCのタスクスケジューラに組んだのでこれで完璧!
めっちゃ快適になった。
もっと色々なことに使ってみたい。
懸念
PowerShell使うと色々な処理ができてしまうため、安全性が気になるところ。