0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PowerShellがルーチンワークから解放してくれた件

Last updated at Posted at 2024-11-22

概要

ある日、サーバのドライブが空き容量ゼロになり、本番システムが一部停止してしまう。
管理しているサーバすべてのドライブ空き容量が残りわずかになっていないか
毎日確認してくださいと指示されてしまう。

毎日は面倒 単純作業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使うと色々な処理ができてしまうため、安全性が気になるところ。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?