tech.guitarrapc.cóm

Technical updates

PowerShellに任意の日付を問い合わせて結果をバッチで受け取る

以前公開した以下での日付取得を少し改良してみました。 バッチでPowershellの出力内容を受け取る 用意したのは、昨日を取得すること限定版、任意の日付を取得する版、のサンプル2つです。 これでバッチで任意の日付をセットすることの不自由さは(私は)完全に回避されました。 長年の悩みがここまですっきり自己解決出来てハッピーです。

前回からの変更点:

  1. MMやDDが1桁の時に、0補完して2桁表示で固したい。
  2. 昨日だけでなく、今日から任意の日、月、年で取得対象の日付を変えたい。
  3. 取得できる日付フォーマットを追加。(YYYYMMDD,YYMMDD,YYYYMM,YYMM,MMDD,YYYY,YY,MM,DD)

利用方法:

  1. PowerShellを呼び出すバッチのパスにPOWERHSELLフォルダを作成します。
  2. POWERSHELLフォルダ内に、利用するPowershellソースを置きます。
  3. バッチから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型に入れれない場合はエラーとなります。 まぁ、まずそんな事をする必要はないかと思いますがー