以前公開した以下での日付取得を少し改良してみました。 バッチでPowershellの出力内容を受け取る 用意したのは、昨日を取得すること限定版、任意の日付を取得する版、のサンプル2つです。 これでバッチで任意の日付をセットすることの不自由さは(私は)完全に回避されました。 長年の悩みがここまですっきり自己解決出来てハッピーです。
前回からの変更点:
- MMやDDが1桁の時に、0補完して2桁表示で固したい。
- 昨日だけでなく、今日から任意の日、月、年で取得対象の日付を変えたい。
- 取得できる日付フォーマットを追加。(YYYYMMDD,YYMMDD,YYYYMM,YYMM,MMDD,YYYY,YY,MM,DD)
利用方法:
- PowerShellを呼び出すバッチのパスにPOWERHSELLフォルダを作成します。
- POWERSHELLフォルダ内に、利用するPowershellソースを置きます。
- バッチからPowershellを実行させます。
PowerShellソースとバッチでの取得例は、以下からどうぞ。 ====
昨日の日付を取得するPowerShellソース例
以下のPowerShellソースを、「Get_Yesterday.ps1」というファイル名でPOWERSHELLフォルダ内に設置します。 ※以下のソースは、バッチでPowerShellの出力内容を受け取るとスイッチ/ファイル名に互換性があるので、.ps1を差し替えて動作します。
#PowerShell 2.0 #ファイル名 : Get_Yesterday.ps1 #Select switch for Yesterday's date format param( [switch]$YYYYMMDD , [switch]$YYMMDD , [switch]$YYYYMM , [switch]$YYMM , [switch]$MMDD , [switch]$YYYY , [switch]$YY , [switch]$MM , [switch]$DD ) #Set Global Variable for Yesterday $date = (Get-Date).AddDays(-1) function Get-YearYYYY{ param ( ) $TempYearYYYY = $date | select @{"name"="year";"expression"={"{0,4:0000}" -F $_.Year}} $YearYYYY = $TempYearYYYY.year.ToString() return $YearYYYY } function Get-YearYY{ param ( ) $YearYY = (Get-YearYYYY).SubString(2,2) return $YearYY } function Get-MonthMM{ param ( ) $TempMonthMM = $date | select @{"name"="month";"expression"={"{0,2:00}" -F $_.Month}} $MonthMM = $TempMonthMM.month.ToString() return $MonthMM } function Get-DayDD{ param ( ) $TempDayDD = $date | select @{"name"="day";"expression"={"{0,2:00}" -F $_.Day}} $DayDD = $TempDayDD.day.ToString() return $DayDD } function Get-Yesterday{ param ( [string]$dateformat ) switch ($dateformat) { "YYYYMMDD" { # Get YYYYMMDD date format $yyyymmdd = (Get-YearYYYY) + (Get-MonthMM) + (Get-DayDD) return $yyyymmdd } "YYMMDD" { # Get YYMMDD date format $yymmdd = (Get-YearYY) + (Get-MonthMM) + (Get-DayDD) return $yymmdd } "YYYYMM" { # Get YYYYMM date format $yyyymm=(Get-YearYYYY) + (Get-MonthMM) return $yyyymm } "YYMM" { # Get YYMM date format $yymm = (Get-YearYY) + (Get-MonthMM) return $yymm } "MMDD" { # Get MMDD date format $mmdd = (Get-MonthMM) + (Get-DayDD) return $mmdd } "YYYY" { # Get YYYY date format $yyyy = (Get-YearYYYY) return $yyyy } "YY" { # Get YY date format $yy = (Get-YearYY) return $yy } "MM" { # Get MM date format $mm = (Get-MonthMM) return $mm } "DD" { # Get DD date format $dd = (Get-DayDD) return $dd } default { throw "Invalid -dateformat arguments." } } } if ($YYYYMMDD){Get-Yesterday -dateformat YYYYMMDD} if ($YYMMDD){Get-Yesterday -dateformat YYMMDD} if ($YYYYMM){Get-Yesterday -dateformat YYYYMM} if ($YYMM){Get-Yesterday -dateformat YYMM} if ($MMDD){Get-Yesterday -dateformat MMDD} if ($YYYY){Get-Yesterday -dateformat YYYY} if ($YY){Get-Yesterday -dateformat YY} if ($MM){Get-Yesterday -dateformat MM} if ($DD){Get-Yesterday -dateformat DD}
以下のバッチ構文で、昨日の日付を与えるスイッチに応じて任意の書式で読み込めます。
@ECHO OFF REM -------------------------------------- REM Get Yesterday Date REM -------------------------------------- FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Yesterday.ps1 -YYYYMMDD`) DO @SET YYYYMMDD=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Yesterday.ps1 -YYMMDD`) DO @SET YYMMDD=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Yesterday.ps1 -YYYYMM`) DO @SET YYYYMM=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Yesterday.ps1 -YYMM`) DO @SET YYMM=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Yesterday.ps1 -MMDD`) DO @SET MMDD=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Yesterday.ps1 -YYYY`) DO @SET YYYY=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Yesterday.ps1 -YY`) DO @SET YY=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Yesterday.ps1 -MM`) DO @SET MM=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Yesterday.ps1 -DD`) DO @SET DD=%%a ECHO %YYYYMMDD% ECHO %YYMMDD% ECHO %YYYYMM% ECHO %YYMM% ECHO %MMDD% ECHO %YYYY% ECHO %YY% ECHO %MM% ECHO %DD% :EOF pause
任意の日付を取得するPowerShellソース例
本日から見て、何日、何月、何年前を数値指定できるようにしています。 以下のPowerShellソースを、「Get_dateformatday.ps1」というファイル名でPOWERSHELLフォルダ内に設置します。 末尾のリマークをはずせば、PowerShell単独で実行板債に結果例や実行速度が分かります。 ※バッチ連携させる際は、必ずリマークしておくこと。
#PowerShell 2.0 #ファイル名 : Get_dateformatday.ps1 #Enter parameter Year, Month Day and Select switch DateFormat. # --------------------------------------------------------------- # /// Parameters to call this .ps1 from batch file or other scripts # /// $TargetDay required to be enter as int. # /// $TargetMonth required to be enter as int. # /// $TargetYear required to be enter as int. # /// Please enter Dateforamat expected. if null, then nothing return. # --------------------------------------------------- param( [parameter(Mandatory=$true, Position=0, HelpMessage="Enter Target Year count from this year. E.G ThisYear=0, LastYear=-1,NextYear=1")] [int]$TargetYear, [parameter(Mandatory=$true, Position=1, HelpMessage="Enter Target Month count from this month. E.G ThisMonth=0, LastMonth=-1,NextMonth=1")] [int]$TargetMonth, [parameter(Mandatory=$true, Position=2, HelpMessage="Enter Target day count from today. E.G Today=0, Yesterday=-1,Tommorow=1")] [int]$TargetDay, [switch]$YYYYMMDD , [switch]$YYMMDD , [switch]$YYYYMM , [switch]$YYMM , [switch]$MMDD , [switch]$YYYY , [switch]$YY , [switch]$MM , [switch]$DD , [switch]$WeekDay ) # --------------------------------------------------- #Set Global Variable for target date # --------------------------------------------------- $date = (Get-Date).AddYears($TargetYear).AddMonths($TargetMonth).AddDays($TargetDay) # --------------------------------------------------- # Prerequiste functions to get date format # --------------------------------------------------- function Get-YearYYYY{ param ( ) $TempYearYYYY = $date | select @{"name"="year";"expression"={"{0,4:0000}" -F $_.Year}} $YearYYYY = $TempYearYYYY.year.ToString() return $YearYYYY } function Get-YearYY{ param ( ) $YearYY = (Get-YearYYYY).SubString(2,2) return $YearYY } function Get-MonthMM{ param ( ) $TempMonthMM = $date | select @{"name"="month";"expression"={"{0,2:00}" -F $_.Month}} $MonthMM = $TempMonthMM.month.ToString() return $MonthMM } function Get-DayDD{ param ( ) $TempDayDD = $date | select @{"name"="day";"expression"={"{0,2:00}" -F $_.Day}} $DayDD = $TempDayDD.day.ToString() return $DayDD } function Get-DayOfWeek{ param ( ) $DayOfWeek = $date.DayOfWeek return $DayOfWeek } # --------------------------------------------------- #Main function to return requested date format # --------------------------------------------------- function Get-Dateformat{ param ( [string]$dateformat ) switch ($dateformat) { "YYYYMMDD" { # Get YYYYMMDD date format $yyyymmdd = (Get-YearYYYY) + (Get-MonthMM) + (Get-DayDD) return $yyyymmdd } "YYMMDD" { # Get YYMMDD date format $yymmdd = (Get-YearYY) + (Get-MonthMM) + (Get-DayDD) return $yymmdd } "YYYYMM" { # Get YYYYMM date format $yyyymm=(Get-YearYYYY) + (Get-MonthMM) return $yyyymm } "YYMM" { # Get YYMM date format $yymm = (Get-YearYY) + (Get-MonthMM) return $yymm } "MMDD" { # Get MMDD date format $mmdd = (Get-MonthMM) + (Get-DayDD) return $mmdd } "YYYY" { # Get YYYY date format $yyyy = (Get-YearYYYY) return $yyyy } "YY" { # Get YY date format $yy = (Get-YearYY) return $yy } "MM" { # Get MM date format $mm = (Get-MonthMM) return $mm } "DD" { # Get DD date format $dd = (Get-DayDD) return $dd } "DayOfWeek" { # Get DayOfWeek return Get-DayOfWeek } default { throw "Invalid -dateformat arguments." } } } # --------------------------------------------------- #Return date value depend on Switch passed when called ps1 from other. # --------------------------------------------------- if ($YYYYMMDD){Get-Dateformat -dateformat YYYYMMDD} if ($YYMMDD){Get-Dateformat -dateformat YYMMDD} if ($YYYYMM){Get-Dateformat -dateformat YYYYMM} if ($YYMM){Get-Dateformat -dateformat YYMM} if ($MMDD){Get-Dateformat -dateformat MMDD} if ($YYYY){Get-Dateformat -dateformat YYYY} if ($YY){Get-Dateformat -dateformat YY} if ($MM){Get-Dateformat -dateformat MM} if ($DD){Get-Dateformat -dateformat DD} if ($DayOfWeek){Get-Dateformat -dateformat DayOfWeek} <# # --------------------------------------------------- # To get values, use function as listed below. # --------------------------------------------------- Get-Dateformat -dateformat YYYYMMDD Get-Dateformat -dateformat YYMMDD Get-Dateformat -dateformat YYYYMM Get-Dateformat -dateformat YYMM Get-Dateformat -dateformat MMDD Get-Dateformat -dateformat YYYY Get-Dateformat -dateformat YY Get-Dateformat -dateformat MM Get-Dateformat -dateformat DD Get-Dateformat -dateformat DayOfWeek # ----------------------------------- #> <# # --------------------------------------------------- # To Measure Commands # --------------------------------------------------- Measure-Command { Get-Dateformat -dateformat YYYYMMDD } Measure-Command { Get-Dateformat -dateformat YYMMDD } Measure-Command { Get-Dateformat -dateformat YYYYMM } Measure-Command { Get-Dateformat -dateformat YYMM } Measure-Command { Get-Dateformat -dateformat MMDD } Measure-Command { Get-Dateformat -dateformat YYYY } Measure-Command { Get-Dateformat -dateformat YY } Measure-Command { Get-Dateformat -dateformat MM } Measure-Command { Get-Dateformat -dateformat DD } Measure-Command { Get-Dateformat -dateformat DayOfWeek } # ----------------------------------- #>
次のバッチ構文で、任意の日付を与えるスイッチに応じて任意の書式で読み込めます。 以下は、-TagetDay -1にすることで昨日の日付を取得しています。 前月なら-TagetMonth -1にすることで取得できます。 来年なら-TagetYear 1にすることで取得できます。 以下略。
@ECHO OFF REM -------------------------------------- REM Get requested Date REM -------------------------------------- FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Dateformatday.ps1 -TargetYear 0 -TargetMonth 0 -TargetDay -1 -YYYYMMDD`) DO @SET YYYYMMDD=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Dateformatday.ps1 -TargetYear 0 -TargetMonth 0 -TargetDay -1 -YYMMDD`) DO @SET YYMMDD=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Dateformatday.ps1 -TargetYear 0 -TargetMonth 0 -TargetDay -1 -YYYYMM`) DO @SET YYYYMM=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Dateformatday.ps1 -TargetYear 0 -TargetMonth 0 -TargetDay -1 -YYMM`) DO @SET YYMM=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Dateformatday.ps1 -TargetYear 0 -TargetMonth 0 -TargetDay -1 -MMDD`) DO @SET MMDD=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Dateformatday.ps1 -TargetYear 0 -TargetMonth 0 -TargetDay -1 -YYYY`) DO @SET YYYY=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Dateformatday.ps1 -TargetYear 0 -TargetMonth 0 -TargetDay -1 -YY`) DO @SET YY=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Dateformatday.ps1 -TargetYear 0 -TargetMonth 0 -TargetDay -1 -MM`) DO @SET MM=%%a FOR /F "usebackq" %%a IN (`powershell .\powershell\Get_Dateformatday.ps1 -TargetYear 0 -TargetMonth 0 -TargetDay -1 -DD`) DO @SET DD=%%a ECHO %YYYYMMDD% ECHO %YYMMDD% ECHO %YYYYMM% ECHO %YYMM% ECHO %MMDD% ECHO %YYYY% ECHO %YY% ECHO %MM% ECHO %DD% :EOF pause
※注意 TargetYearは0000年などDateTime型に入れれない場合はエラーとなります。 まぁ、まずそんな事をする必要はないかと思いますがー