@echo off
setlocal enabledelayedexpansion

REM 元号のリスト
set "eraList=1:明治,2:大正,3:昭和,4:平成,5:令和"

REM 和暦から西暦への変換関数
:ConvertToAD
setlocal
set "era=%~1"
set "year=%~2"
set "convertedYear="
for %%i in (%eraList%) do (
    for /f "tokens=1,2 delims=: " %%a in ("%%i") do (
        if "%%a"=="!era!" (
            set /a "convertedYear=%%b+!year!"
            exit /b
        )
    )
)
exit /b

set /p "era=元号を入力してください (1:明治, 2:大正, 3:昭和, 4:平成, 5:令和): "
set /p "year=年を入力してください: "
set /p "month=月を入力してください: "
set /p "day=日を入力してください: "

REM 元号と年から西暦への変換
call :ConvertToAD !era! !year!
set "convertedDate=%convertedYear%%month%%day%"

REM 結果を表示
echo 変換された形式の日付: %convertedDate%

REM 生年月日の正当性をチェック
powershell -command "& {try { [DateTime]::ParseExact('%convertedDate%', 'yyyyMMdd', [System.Globalization.CultureInfo]::InvariantCulture) } catch { exit 1 }}"

if %errorlevel% neq 0 (
    echo 生年月日の形式が正しくありません。再度入力してください。
    exit /b
)

set /p "eraCrime=犯行日の元号を入力してください (1:明治, 2:大正, 3:昭和, 4:平成, 5:令和): "
set /p "yearCrime=犯行日の年を入力してください: "
set /p "monthCrime=犯行日の月を入力してください: "
set /p "dayCrime=犯行日の日を入力してください: "

REM 犯行日の元号と年から西暦への変換
call :ConvertToAD !eraCrime! !yearCrime!
set "convertedCrimeDate=%convertedYear%%monthCrime%%dayCrime%"

REM 犯行日の正当性をチェック
powershell -command "& {try { [DateTime]::ParseExact('%convertedCrimeDate%', 'yyyyMMdd', [System.Globalization.CultureInfo]::InvariantCulture) } catch { exit 1 }}"

if %errorlevel% neq 0 (
    echo 犯行日の形式が正しくありません。再度入力してください。
    exit /b
)

set /p "eraArrest=起訴日の元号を入力してください (1:明治, 2:大正, 3:昭和, 4:平成, 5:令和): "
set /p "yearArrest=起訴日の年を入力してください: "
set /p "monthArrest=起訴日の月を入力してください: "
set /p "dayArrest=起訴日の日を入力してください: "

REM 起訴日の元号と年から西暦への変換
call :ConvertToAD !eraArrest! !yearArrest!
set "convertedArrestDate=%convertedYear%%monthArrest%%dayArrest%"

REM 起訴日の正当性をチェック
powershell -command "& {try { [DateTime]::ParseExact('%convertedArrestDate%', 'yyyyMMdd', [System.Globalization.CultureInfo]::InvariantCulture) } catch { exit 1 }}"

if %errorlevel% neq 0 (
    echo 起訴日の形式が正しくありません。再度入力してください。
    exit /b
)

REM 犯行日における年齢の計算
powershell -command "& { $birthdate = [DateTime]::ParseExact('%convertedDate%', 'yyyyMMdd', [System.Globalization.CultureInfo]::InvariantCulture); $crimeDate = [DateTime]::ParseExact('%convertedCrimeDate%', 'yyyyMMdd', [System.Globalization.CultureInfo]::InvariantCulture); $ageAtCrime = $crimeDate.Year - $birthdate.Year; if ($crimeDate.Month -lt $birthdate.Month -or ($crimeDate.Month -eq $birthdate.Month -and $crimeDate.Day -lt $birthdate.Day)) { $ageAtCrime-- }; Write-Host '犯行日 (%eraCrime% %yearCrime%/%monthCrime%/%dayCrime%) 時点での年齢は ' $ageAtCrime ' 歳です.' }"

REM 起訴日における年齢の計算
powershell -command "& { $birthdate = [DateTime]::ParseExact('%convertedDate%', 'yyyyMMdd', [System.Globalization.CultureInfo]::InvariantCulture); $arrestDate = [DateTime]::ParseExact('%convertedArrestDate%', 'yyyyMMdd', [System.Globalization.CultureInfo]::InvariantCulture); $ageAtArrest = $arrestDate.Year - $birthdate.Year; if ($arrestDate.Month -lt $birthdate.Month -or ($arrestDate.Month -eq $birthdate.Month -and $arrestDate.Day -lt $birthdate.Day)) { $ageAtArrest-- }; Write-Host '起訴日 (%eraArrest% %yearArrest%/%monthArrest%/%dayArrest%) 時点での年齢は ' $ageAtArrest ' 歳です.' }"

pause

REM 和暦から西暦への変換関数
:ConvertToAD
setlocal
set "era=%~1"
set "year=%~2"
set "convertedYear="
for %%i in (%eraList%) do (
    for /f "tokens=1,2 delims=: " %%a in ("%%i") do (
        if "%%a"=="!era!" (
            set /a "convertedYear=%%b+!year!"
            exit /b
        )
    )
)
exit /b