【BAT】.NET Framework 4系バージョンを確認する

# はじめに
同僚がデータ修正ツールを作成する上で、社内のアプリケーションサーバーのWindows Server 2016の環境で.NET Framework 4系のどのバージョンが入っているのか確認する必要がありました。
以前、オフライン環境のPCにて.NET Framework 4.6のインスールを確認するバッチを作成したことがあったので一部を切り出して、リリースの値を取得しました。その値からどの.NET Frameworkのバージョンなのかを下記サイトで確認することが出来ます。

https://docs.microsoft.com/ja-jp/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed

リリースの値は、`394806`で`.NET Framework 4.6.2`であることが分かりました。

# バッチファイル版
.NET Framework 4.6のインスールを確認するバッチから一部を切り出して、リリースの値からどのバージョンなのかを照合するように改良しました。

```bat:GetVerDotNETFW4.bat
@echo off

REM ------------------------------------------------------------------------------
REM .NET Framework 4系バージョンの確認
REM ------------------------------------------------------------------------------
set NETFRAMEWORKPATH=%~dp0
cd /d "%windir%\system32\"

setlocal enabledelayedexpansion

REM 引数（リモート・コンピュータ名）の確認
if %1. == . (
    set RemoteName=
    echo ローカル・コンピュータ（%COMPUTERNAME%）
) else (
    set RemoteName=%1\
    echo %1
)

REM レジストリに参照できるか確認
reg query %RemoteName%HKLM\SOFTWARE\Microsoft 1>nul
if errorlevel 1 (
    echo %0： レジストリを参照できません。エラーが発生しました。
    pause
    endlocal
    exit /b
)

REM レジストリ・エントリの指定
REM .NET Frameworkのレジストリを参照
set RegKey11=%RemoteName%HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP

REM .NET Frameworkのバージョン確認
call :GetVersion ".NET Framework 4" "%RegKey11%\v4"

endlocal
echo.

pause
exit /b

REM -------------------------------------------------
REM  .NET Framework 4系のバージョン取得
REM -------------------------------------------------
:GetVersion
    set result=

    REM インストールの確認
    reg query "%~2\Full" /v "Install" 2>nul | find /I "Install" 2>nul | find /I "0x1" 1>nul 2>nul
    set nf4=%errorlevel%

    if %nf4%==1 (
            echo.
            echo .NETFramework4.0系統が未インストール
    ) else (
            FOR /F "TOKENS=1,2,*" %%A IN ('reg query "%~2\Full" /v "Release"') DO IF "%%A"=="Release" SET /A GET_VALUE=%%C
            set result="No 4.5 or later version detected"

            if !GET_VALUE! geq 378389 set result=4.5
            if !GET_VALUE! geq 378675 set result=4.5.1
            if !GET_VALUE! geq 379893 set result=4.5.2
            if !GET_VALUE! geq 393295 set result=4.6
            if !GET_VALUE! geq 394254 set result=4.6.1
            if !GET_VALUE! geq 394802 set result=4.6.2
            if !GET_VALUE! geq 460798 set result=4.7
            if !GET_VALUE! geq 461308 set result=4.7.1
            if !GET_VALUE! geq 461808 set result=4.7.2
            if !GET_VALUE! geq 528040 set result=4.8 or later
            echo.
            echo .NET Frameworkバージョン !result!
    )

exit /b
```

## 結果
```
.NET Frameworkバージョン 4.6.2

続行するには何かキーを押してください . . .
```

# PowerShell版
.NET Frameworkのバージョンを確認するのが面倒でもっと簡単な方法があるだろうとネットで調べると、 今ならPowerShellで1ライナーで求めることが出来ます。やはり、レジストリを参照するんですよね。

```powershell
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where { $_.PSChildName -Match '.*L.*'} | Select PSChildName, version
```

参照:[.Net Framework のバージョンを調べる簡単なコマンド](http://tooljp.com/qa/A-simple-command-to-check-the-Net-Framework-version-9113.html)

ちなみにPowerShellのバージョンによっては、実行結果のVersionの項目がない場合もあるそうです。
Windows Server 2016では、PowerShell 5.1のバージョンだったので問題ありませんでした。

## 結果

```
PSChildName Version
----------- -------
Client      4.6.01586
Full        4.6.01586
Client      4.0.0.0
``` 

Versionの項目があったとしても、これだと`.NET Framework 4.6.2`なのか分かりませんね。大まかなバージョンが分かるだけなら問題ないですが・・・
下記の記事ならリリースの値から、どのバージョンなのかを照合してくれます。

https://qiita.com/satoshi_iwashita/items/0032969159af2b88d6e8

# 最後に
PowerShellで求めることが出来るので不要かなと思うのですが、せっかくバッチファイル版を作成したので公開しておきます。