俺のメモ帖

とあるインフラ系SEのメモ帖。趣味や技術的なもとか書けたらいいなぁ。

バッチで簡単に前日日付、翌日日付などを変数に設定する方法

 バッチファイルにて、日付を処理することはよくあると思う。
昔は、わざわざ日付計算用の関数をバッチで100ステップかけて作ったり、計算用のVBSを作ってみたり、いろいろ手間をかけてたと思う。

今は、PowerShell使えば1行で書ける。

当日日付の取得

FOR /F "usebackq delims=" %a in (`powershell "(get-date).ToString(\"yyyy/MM/dd\")"`) do Set TODAY=%aa

【説明】

実行結果を変数に格納する、FOR文にて、``で囲んだコマンドを実行結果を取得する"usebackq"オプションを使用。
実行するコマンド自体はPowerShellを使う。
Get-Dateで当日日時が取得できる。
当然「日時」なので、このままだと「2018年10月26日 9:04:14」といった感じになる。
なので、Get-Dateの結果をToStringでフォーマットを指定する。
フォーマットを好きに指定できるということは、当然よく利用される『YYYYMMDD』形式とかでも出力できる。その場合は"yyyyMMdd"と指定すればよい。

 

前日日付の取得

FOR /F "usebackq delims=" %a in (`powershell "(get-date).AddDays(-1).ToString(\"yyyy/MM/dd\")"`) do Set PREDAY=%aa

【説明】

当日日付の取得方法をほぼ応用。
Get-Dateの結果は、DateTime型のため、そのまま日付計算のAddDayメソッドを使用して、1日前なので引数に「-1」を指定する。

 

翌日日付の取得

FOR /F "usebackq delims=" %a in (`powershell "(get-date).AddDays(1).ToString(\"yyyy/MM/dd\")"`) do Set NEXTDAY=%aa

【説明】

当日日付の取得方法をほぼ応用。
Get-Dateの結果は、DateTime型のため、そのまま日付計算のAddDayメソッドを使用して、1日後なので引数に「1」を指定する。

 

当月月初日の取得

FOR /F "usebackq delims=" %a in (`powershell "(get-date -Day 1).ToString(\"yyyy/MM/dd\")"`) do Set FIRSTDAY=%aa

【説明】

Get-Dateコマンドレット実行時の引数として、「-Day 1」を指定することで、日付部分が1日の結果が返される。

当月月末日の取得

FOR /F "usebackq delims=" %a in (`powershell "(get-date -Day 1).AddMonths(1).AddDays(-1).ToString(\"yyyy/MM/dd\")"`) do Set LASTDAY=%aa

【説明】

当月月初日を利用した応用編。
当月月初日から1ヵ月後の翌月月初日付をAddMonthsメソッドで算出し、その日付の現実をAddDaysメソッドで取得する。

 

まあ、結局のところ、PowerShellワンライナーでできることの結果ならバッチファイルで書けるんでいけますね。

これだけで、バッチファイルでできること、今よりぐっと広がります。
なんたって、.NET Frameworkがだいたい使えることになりますから。

Windows PowerShellクックブック

Windows PowerShellクックブック

 

 

 

欠点は、、、、PowerShellちょっと重たいことと、、、あまりに複雑な処理書くとわかりにくくなることとか。

あとは、PowerShellが使用できるバージョンのWindowsでないといけないこととかかな?

上記のPowershell部分、もっとよい書き方があれば教えてもらえるとうれしいです。

 

以上