require 'win32ole' # 有効なシリアルポートの一覧をハッシュで返す。 # (ポート名が key、接続機器の名前が value) def serialports locator = WIN32OLE.new("WbemScripting.SWbemLocator") services = locator.ConnectServer() comlist = {} # 内蔵シリアルポート一覧を取得 services.ExecQuery("SELECT * FROM Win32_SerialPort").each do |item| comlist[item.DeviceID] = item.Name end # PnPシリアルポート一覧を取得 services.ExecQuery("SELECT * FROM Win32_PnPEntity").each do |item| comlist[$1] = item.Description if item.Name =~ /\((COM\d+)\)/ end return Hash[ # シリアルポート名に含まれる数字も考慮し昇順にソート comlist.sort_by {|k, v| k.scan(/(\d+)|([^\d]+)/).map{|s| s[0] ? [0, s[0].to_i] : [1, s[1]] } } ] end puts serialports.map{|k, v| "#{k}: #{v}"}