【PowerShell】あと何日?残り日数をメールしてくれるスクリプトの作成方法

こんにちは。
けいぞうです。

大変です。

YouTubeのアカペラ動画で話題となったハロー!プロジェクトのグループ
「こぶしファクトリー」の解散まで残り1か月となってしまいました。

ハロー!プロジェクト公式サイトの記事

これから1か月は1日1日を噛みしめながら生きていかなければなりません(ガチヲタ)


という訳でお得意のPowerShellを使って特定の日まであと何日か?をメールでお知らせしてくれるスクリプトを作成する方法を解説していきたいと思います。

[目次]


PowerShellが初めてという方はまずはこちらから

あと何日かメールで通知してくれるスクリプトのソース

ソースコードとしては、いたってシンプルです。

#今日の日付をyyyyMMddで取得
$today = (Get-Date).ToString("yyyyMMdd")

#ターゲットの日をyyyyMMddで設定
$targetDate = "20200330"

#DateTimeに変換
$today = [DateTime]::ParseExact($today,"yyyyMMdd", $null);
$targetDate = [DateTime]::ParseExact($targetDate,"yyyyMMdd", $null);

#残りの日数を取得
$LeftDate = ($targetDate - $today).Days

#メールで送信する
$EmailFrom = "notice@example.com"
$EmailTo = "【送信先のメールアドレス】"
$Subject = "こぶしファクトリー解散まで" 
$Body = "こぶしファクトリー解散まであと" + $LeftDate + "日"  
$SMTPServer = "smtp.gmail.com" 
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("【Googleアカウント名(メールアドレス)】","【Googleアプリパスワード】"); 
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

yyyyMMdd形式で設定した後にDateTimeに変換しています。

少しまどろっこしいやり方に見えるかもしれませんが、こうすると、後は12行目のように引き算で残り日数を計算してくれるので、意外とシンプルにコーディングすることができます。


通常、普通にGet-Dateをすると以下のような日付と時刻の形式で結果を返してくれます。

>Get-Date

2020年2月29日 11:48:59

これを2行目のようにToString()メソッドを使えば、欲しいフォーマットで受け取ることができます。

PS C:\Users> (Get-Date).ToString("yyyy")
2020
PS C:\Users> (Get-Date).ToString("yyyyMM")
202002
PS C:\Users> (Get-Date).ToString("yyyyMMdd")
20200229
PS C:\Users> (Get-Date).ToString("yyyy/MM/dd")
2020/02/29
PS C:\Users> (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
2020/02/29 11:49:48

また、12行目の残り日数の計算の部分ですが、普通に引き算だけすると、以下のような結果が返ってきます。

PS C:\Users>  $targetDate - $today


Days              : 30
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 0
Ticks             : 25920000000000
TotalDays         : 30
TotalHours        : 720
TotalMinutes      : 43200
TotalSeconds      : 2592000
TotalMilliseconds : 2592000000

Days, Hours, Minutes, Seconds, Millisecondsなど、細かくプロパティに持っているようです。

今回欲しいのは日数だけなので

($targetDate – $today).Days

のように、ドットで繋げて「Days」を取得しました。


ちなみに、PowerShellは以下のような書き方もできます。

PS C:\Users> $targetDate - $today | select Days

Days
----
  30

こうすると、結果がオブジェクトとして返されて、そのDaysプロパティのに「30」が入っているという形になります。

ドットで繋げて書いた場合は、オブジェクトではなく、ただくスカラー値になります。


メール送信部分については、方法はさまざまありますが、

今回はGmailを使って送信する方法を採用しました。

総合的に見て、個人で開発する場合は、この方法が最も楽です。

個人ではなく、しっかりしたお仕事等でSmtpサーバーが用意されている場合は、以下の方法でメール送信が可能ですので、参考にどうそ。

また、Gmailでの送信には「アプリパスワード」が必要になります。

アプリパスワードについては、以下の記事で解説していますので、参考にどうぞ。

プログラムの実行方法

ただスクリプトを作ってもこれを毎日実行してくれないと意味がないのですが、個人のPCしか持っていない人は残念ながら微妙な案ではありますが、PCを起動しているという前提条件で、以下の方法が考えられます。

タスクスケジューラで実行させる

大体毎日夜の21時はPCを開いているとか、そういう時間で1日おきに実行させるようにタスクスケジューラに設定しておけば良いかと思います。


まず、タスクスケジューラを開きます。

開いたら、何でもいいのですが、例としてPowerShellスクリプト実行用のフォルダを1つ作っておきましょう。

「タスク スケジューラ ライブラリ」を右クリックして、「新しいフォルダー」を選択。「PowerShell」という名前でフォルダを作成します。

作成したら、そのフォルダをクリックしてください。

右側のフィールドが空っぽになっていると思います。

そこで右クリックして、「新しいタスクの作成」を選択してください。

タスクの作成ウィンドウが開きます。


全般タブですが、「名前」にタスク名を指定

セキュリティオプションですが、なるべくどんな状況でも実行してほしいので

「ユーザーがログオンしているかどうかにかかわらず実行する」を選択。

「最上位の特権で実行する」も選択しておくと良いでしょう。

その他は任意でよいです。

トリガータブです。

ここでは、いつタスクを実行するかなどを設定します。

「新規」をクリック

「毎日」を選択、開始の日付は今日からにして、時間は大体PCを起動している時間が良いでしょう。ここでは21時に設定しました。

有効にチェックが入っていることを確認して、OKをクリック。

これでトリガーが作成されました。

操作タブです。

ここでどのスクリプトを実行するかを指定します。

「新規」をクリック

PowerShellのスクリプトを実行する場合は以下のように設定します。

プログラム/スクリプトの欄に「PowerShell.exe」を記入

引数の追加の欄に「-file 【スクリプトのフルパス】」を記入します。

OKをクリックします。

これで操作の作成ができました。

条件タブです。

「次の間アイドル状態の場合のみタスクを開始する」はチェックなし

「コンピューターをAC電源で使用している場合のみタスクを開始する」はチェックなし

「タスクを実行するためにスリープを解除する」はチェックあり

に設定しました。お好みで設定してください。

設定タブです。

基本的にデフォルトで問題ないですが、タスクを停止するまでの時間を「1時間」に変更しておきました。

ここまで設定ができたら、「OK」をクリックします。

タスクが1つ作成されました。

これで今日の21時から毎日メールが送られますが、試しに右クリックで実行してみてください。

メールが正常に送信されていれば、OKです!

追伸

こぶしファクトリーさんの先月の突然の解散発表から今日まであっという間で、あと1か月になってしまいました。

こんなときに、コロナウイルスの流行により、3月15日までのイベントが全て中止になってしまっています。メンバーならびにファンの皆様の心中お察しいたします。私もこぶし組ですので、皆の苦しみが分かります。

3月30日のラストコンサートは予定通り開催されることを心から願っています。

そのために私にできることは、コロナウイルスに感染しないこと。それくらいしかないと思っていますので、うがい、手洗い、アルコール消毒、食事、睡眠。

しっかりとって、健康第一で残り1か月暮らしていきます。