バッチ処理でその月の日数に応じた回数の処理を行いたいことがあり、自動で日数を取得(判別)してループ処理するスクリプトを作成したのでメモとして残します。
使い方としては、年月(○年○月)を引数に渡して実行すれば、自動的にその月の日数を取得/判別する。
月間の日数を自動的に取得してループ処理
月間の日数を取得する方法
DaysInMonth メソッドで取得できます。
1 2 3 4 5 6 |
PS> [DateTime]::DaysInMonth(2021,2) 28 PS> [DateTime]::DaysInMonth(2021,3) 31 PS> [DateTime]::DaysInMonth(2021,4) 30 |
「今」の値が必要であれば、以下。
1 2 3 4 5 6 7 8 9 |
PS D:\> $year = Get-Date -Format yyyy PS D:\> $month = Get-Date -Format MM PS D:\> $year 2022 PS D:\> $month 02 PS D:\> [DateTime]::DaysInMonth( $year , $month ) 28 |
来月であれば、以下。
1 2 3 4 5 6 7 8 9 |
PS D:\> $date = (Get-Date).AddMonths(1) PS D:\> $year = $date | Get-Date -Format yyyy PS D:\> $month = $date | Get-Date -Format MM PS D:\> $year 2022 PS D:\> $month 03 PS D:\> [DateTime]::DaysInMonth( $year , $month ) 31 |
1日~月末日までループ処理を行う
これを応用して、1日~月末日までループ処理を行うようなスクリプトを作成しました。指定した月の1~月末日までを自動的に判別します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
### 対象月の日数分ループ処理 # 対象年月 $Year = $Args[0] $Month = $Args[1] # 対象年月の日数取得 $Days = [DateTime]::DaysInMonth($Year,$Month) # 対象年月の日数分ループ処理 $Day = 1 while ($Day -le $Days) { ## 1桁表示 #$Dayfmt = $Day #$Monthfmt = $Month ## 2桁表示 $Dayfmt = $Day.ToString("00") $Monthfmt = $Month.ToString("00") echo "$Year/$Monthfmt/$Dayfmt" $Day++ } |
月と日を、一桁表示とするか、二桁表示とするかは選択できます。↑のスクリプト内「n桁表示」箇所を修正します。
実行結果は以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
## 一桁表示 PS> D:\test1\対象月の日数分ループ処理.ps1 2022 2 2022/2/1 2022/2/2 2022/2/3 2022/2/4 2022/2/5 :略 2022/2/24 2022/2/25 2022/2/26 2022/2/27 2022/2/28 ### 二桁表示 PS> D:\test1\対象月の日数分ループ処理.ps1 2022 2 2022/02/01 2022/02/02 2022/02/03 2022/02/04 2022/02/05 :略 2022/02/24 2022/02/25 2022/02/26 2022/02/27 2022/02/28 |
以上です。