とりあえず、Ruby で .NET Framework のバージョンを調べてみた

Windows 使ってると、.NET Framework のバージョンが気になるよね。
そこで、Ruby .NET Framework のバージョンを確かめるスクリプトを書いてみたよ!みたよ!

実はね、.NET Frameworkのバージョンを確認する方法 [atmarkit.co.jp] っていう記事を覧て書いてみようと思ったんだー。
ばっちふぁいるでもできるなら、Ruby でもできるのはとーぜん!!*1
まずはこれ:

unless RUBY_PLATFORM =~ /mswin(?!ce)|mingw|cygwin|bccwin/ then
  $stderr.puts "お使いの OS は Windows ではありませんでした。"

  exit
end

とりあえず、RUBY_PLATFORM [hatena.ne.jp] を使って ruby が走ってるプラットフォームを調べるよー。
次は、win/registory をあれするよー。

require 'win32/registry'

どうして調べてからあれするのかっていうと、Windows じゃないのにあれできるのかなーってちょっと不安だったんだよね。
次は、レジストリのパスの定数を設定するよー。

DOT_NET_FRAMEWORK1_0 = 'SOFTWARE\Microsoft\NET Framework Setup\Full\v1.0.3705\1041\Microsoft .NET Framework Full v1.0.3705 (1041)'
DOT_NET_FRAMEWORK1_0_PATCH_LEVEL = 'SOFTWARE\Microsoft\Active Setup\Installed Components\{78705f0d-e8db-4b2d-8193-982bdda15ecd}'

DOT_NET_FRAMEWORK = 'SOFTWARE\Microsoft\NET Framework Setup\NDP'
DOT_NET_FRAMEWORK1_1 = DOT_NET_FRAMEWORK + '\v1.1.4322'
DOT_NET_FRAMEWORK2_0 = DOT_NET_FRAMEWORK + '\v2.0.50727'
DOT_NET_FRAMEWORK3_0 = DOT_NET_FRAMEWORK + '\v3.0'
DOT_NET_FRAMEWORK3_5 = DOT_NET_FRAMEWORK + '\v3.5'

DOT_NET_FRAMEWORK4_0 = 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client'

まあ、みればわかるよね。
ということで、.NET Framework 1.0 がインストールされているかを調べてみるよー。

begin
  Win32::Registry::HKEY_LOCAL_MACHINE.open( DOT_NET_FRAMEWORK1_0 ) do |section|
    installed = section['Install'].to_i

    puts ".NET Framework 1.0" if installed == 1
  end

  Win32::Registry::HKEY_LOCAL_MACHINE.open( DOT_NET_FRAMEWORK1_0_PATCH_LEVEL ) do |section|
    value = section['Version'].split( /,/ ).pop.to_i

    puts ".NET Framework 1.0 Service Pack #{value}" if value != 0
  end
rescue
  # nothing
end

1.0 だけちょっと特殊なんだよねー。
でも、1.1 から 3.5 まではおんなじ様な方法で調べられるよー。

framework_versions = [ ".NET Framework 1.1", ".NET Framework 2.0", ".NET Framework 3.0", ".NET Framework 3.5" ]

[ DOT_NET_FRAMEWORK1_1, DOT_NET_FRAMEWORK2_0, DOT_NET_FRAMEWORK3_0, DOT_NET_FRAMEWORK3_5].each_with_index do |path, i|
  framework_version = framework_versions[i]
  begin
    Win32::Registry::HKEY_LOCAL_MACHINE.open( path ) do |section|
      installed = section['Install'].to_i
      service_pack = section['SP'].to_i

      if installed == 1 then
        puts framework_version
        puts "#{framework_version} Service Pack #{service_pack}" if service_pack > 0
      end
    end

    Win32::Registry::HKEY_LOCAL_MACHINE.open( path + '\1041' ) do |section|
      installed = section['Install'].to_i
      service_pack = section['SP'].to_i
      if service_pack == 0 then
        puts "#{framework_version} 日本語 Language Pack"
      else
        puts "#{framework_version} 日本語 Language Pack #{service_pack}"
      end
    end
  rescue
    # nothing
  end
end

SP が 0 なら Security Pack をインストールしてなくてー、1 以上はそのまま Security Pack のバージョン?になってるってすんぽー。
次は 4 いってみるよー。

begin
  Win32::Registry::HKEY_LOCAL_MACHINE.open( DOT_NET_FRAMEWORK4_0 ) do |section|
    installed = section['Install'].to_i

    puts ".NET Framework 4.0" if installed == 1
  end
rescue
  # nothing
end

今現在、4 の SP は出てない気がするので、SP はないよー。
ということでフェーズごとに簡単な解説したけど、完全版はここ [github.com]ー。

*1:言語には個人差があります