コマンドプロンプトから曜日を取得する (with PowerShell)

2021/06/17に公開

コマンドプロンプト、もしくはバッチファイルでは、曜日を取得することができません。実現方法について調べてみると、VBScript を利用するやり方や、頑張って計算する方法などが見受けられます。

VBScript を利用するやり方については、別途スクリプトファイルを用意しなければいけない、頑張って計算するとなると後で読むのが大変になる、ということで、PowerShell を利用してワンライナーで実行する方法を紹介します。

PowerShell コード

PowerShell では、Get-Date コマンドレットを利用することで、システム日付を取得することができます。

# システム日付を取得する
> Get-Date

2021年6月17日 12:34:56

上記コマンドの戻り値は DateTime 型のオブジェクトですので、DayOfWeek プロパティにて曜日を取得することができます。

# 曜日を取得する
> $now = Get-Date
> $now.DayOfWeek
Thursday

DayOfWeek プロパティの戻り値は、DayOfWeek という列挙体ですので、int 型に型変換することで数値化することができます。

# 曜日を数値化して取得する
# 0: Sunday (日曜日) ~ 6: Saturday (土曜日)
> $now = Get-Date
> $now.DayOfWeek -as [int]
4  # Thursday 木曜日

ということで、上記の値をコマンドプロンプトから取得できれば良さそうです。

ちなみに、上記コマンドをワンライナーに変換すると、次のコマンドになります。

# 曜日を数値化して取得する (ワンライナー)
> (Get-Date).DayOfWeek -as [int]
4

コマンドプロンプト

コマンドプロンプトから PowerShell のコマンドを実行するには、powershell.exe-Command オプションに実行したいコマンドを指定します。

> powershell.exe -Command "(Get-Date).DayOfWeek -as [int]"
4

しかし、上記のコマンドだと、画面には曜日を表す数値が出力されますが、変数に取ることができません。

PowerShell の処理結果を変数に取る方法は、次の 3 通りあります。

  1. for コマンドで変数に設定する
  2. 戻り値 (errorlevel) で連携する

1. for コマンドで変数に設定する

for コマンドを使うと、別のコマンドを実行した際の標準出力を変数に設定することができます。

:: for コマンドで変数 DAYOFWEEK に設定
> for /f "usebackq delims=" %A in (`powershell.exe -Command "(Get-Date).DayOfWeek -as [int]"`) do set DAYOFWEEK=%A

:: 変数確認
> echo %DAYOFWEEK%
4

この方法は、任意のコマンドの出力を変数に設定できますが、 出力が複数行ある場合は最後の行の結果が変数に設定される ため、別コマンド側で考慮する必要があります。

2. 戻り値 (errorlevel) で連携する

コマンドプロンプトでは、コマンドや別プログラムの戻り値を、環境変数 %errorlevel% で取得することができます。

PowerShell で戻り値を設定するには、exit で返します。

:: 戻り値 (errorlevel) で連携する
> powershell.exe -Command "exit (Get-Date).DayOfWeek -as [int]"

:: 確認
> echo %errorlevel%
4

見た目がシンプルなため便利ですが、戻り値には数値しか指定できないため、他の用途で文字列を返したい場合には利用できません。

・・・ちなみに、PowerShell は DayOfWeek 列挙体を exit で返す場合、自動的に数値に変換してくれるようなので、数値変換をせずに取得することができます。

:: 戻り値 (errorlevel) で連携する。数値変換も不要。
> powershell.exe -Command "exit (Get-Date).DayOfWeek"

:: 確認
> echo %errorlevel%
4

まとめ: コマンドプロンプトにて曜日を取得するには ?

ということで、最終的なワンライナーとして、今回は次のものが出来上がりました。
思ったよりシンプルだったのではないでしょうか ?

:: 曜日を取得する
> powershell.exe -Command "exit (Get-Date).DayOfWeek"
> set DAYOFWEEK=%errorlevel%

PowerShell と前述した内容を応用すれば、コマンドプロンプト単体では難しかった処理が実現できるかもしれません。みなさんも PowerShell と仲良くやっていきましょう !!

Discussion