バッチファイルにて、日付を処理することはよくあると思う。
昔は、わざわざ日付計算用の関数をバッチで100ステップかけて作ったり、計算用のVBSを作ってみたり、いろいろ手間をかけてたと思う。
今は、PowerShell使えば1行で書ける。
以下は全てコマンドプロンプトで実行する際の記載なので、バッチファイルに記述する場合は、変数「%a」を「%%a」に直す必要があることを注意すること!
当日日付の取得
FOR /F “usebackq delims=” %a in (`powershell “(get-date).ToString(\”yyyy/MM/dd\”)”`) do Set TODAY=%a |
【説明】
実行結果を変数に格納する、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=%a |
【説明】
当日日付の取得方法をほぼ応用。
Get-Dateの結果は、DateTime型のため、そのまま日付計算のAddDayメソッドを使用して、1日前なので引数に「-1」を指定する。
翌日日付の取得
FOR /F “usebackq delims=” %a in (`powershell “(get-date).AddDays(1).ToString(\”yyyy/MM/dd”)\”`) do Set NEXTDAY=%a |
【説明】
当日日付の取得方法をほぼ応用。
Get-Dateの結果は、DateTime型のため、そのまま日付計算のAddDayメソッドを使用して、1日後なので引数に「1」を指定する。
当月月初日の取得
FOR /F “usebackq delims=” %a in (`powershell “(get-date -Day 1).ToString(\”yyyy/MM/dd\”)”`) do Set FIRSTDAY=%a |
【説明】
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=%a |
【説明】
当月月初日を利用した応用編。
当月月初日から1ヵ月後の翌月月初日付をAddMonthsメソッドで算出し、その日付の前日をAddDaysメソッドで取得する。
まあ、結局のところ、PowerShellのワンライナーでできることの結果ならバッチファイルで書けるんでいけますね。
これだけで、バッチファイルでできること、今よりぐっと広がります。
なんたって、.NET Frameworkがだいたい使えることになりますから。
- 作者: Lee Holmes,マイクロソフト株式会社ITプロエバンジェリストチーム(監訳),菅野良二
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/10/23
- メディア: 大型本
- 購入: 4人 クリック: 72回
- この商品を含むブログ (15件) を見る
欠点は、、、、PowerShellちょっと重たいことと、、、あまりに複雑な処理書くとわかりにくくなることとか。
あとは、PowerShellが使用できるバージョンのWindowsでないといけないこととかかな?
上記のPowershell部分、もっとよい書き方があれば教えてもらえるとうれしいです。
以上