8

レジストリキーを検証するために使用しようとしている次のスニペットがあります(OSはWindows 2008R2またはWin7です)

def value_exists?(path,key)
  reg_type = Win32::Registry::KEY_READ 
  Win32::Registry::HKEY_LOCAL_MACHINE.open(path, reg_type) do |reg|
    begin
      regkey = reg[key]
      return true
    rescue
      return false
    end
  end
end

次の2つのコマンドを実行すると、出力が期待されます(私の場合、falseが返されます)。

puts(value_exists?("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\",'PendingFileRenameOperations'))
puts(value_exists?("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Component Based Servicing\\",'RebootPending'))

私が実行するとき

puts(value_exists?("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Auto Update\\",'RebootRequired')) 

次のエラーが発生します

C:/Ruby187/lib/ruby/1.8/win32/registry.rb:528:in `open': The system cannot find the file specified. (Win32::Registry::Error)
        from C:/Ruby187/lib/ruby/1.8/win32/registry.rb:608:in `open'
        from ./reg2.rb:7:in `value_exists?'
        from ./reg2.rb:21

私はこの仕事をするために何をすべきか本当に理解していません。システムがx64であり、正しい場所でキーを見つけられないことに関係しているのではないかと思います。しかし、これを改善するために何をする必要があるのか​​わかりません。

よろしくお願いします!

4

4 に答える 4

8

私はそれを理解しました-http://msdn.microsoft.com/en-us/library/windows/desktop/aa384129(v= vs.85 ).aspx

reg_type = Win32 :: Registry :: KEY_READ | 0x100

これで問題は解決しました。私の推測では、皆さんはx64でテストしていませんでしたか?

于 2012-11-26T15:27:18.047 に答える
1

あなたの問題は、次のパスSOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Auto Update\\がレジストリに存在しないことです。regeditを使用して確認しましたか?

コードを次のように変更する必要があります-

def value_exists?(path,key)
    reg_type = Win32::Registry::KEY_READ 
    begin
        Win32::Registry::HKEY_LOCAL_MACHINE.open(path, reg_type) {|reg| regkey = reg[key]}
    rescue
        false
    end
end
于 2012-11-26T06:47:53.837 に答える
0

ruby 1.9.2 P286で問題を再現することはできません。キーが存在しなくても、期待どおりに3つのfalseが返されます。

<ruby path> \ lib \ ruby​​ \ <version> \ win32の下にあるソースコードを比較して変更を確認し、自分で更新することができます。

于 2012-11-26T05:15:58.223 に答える
0

を使用してみることもできますENV。これはハッシュとして機能し、ハッシュ関数を実行できるようにします。

ENV.has_key?("CUSTOM_PATH") #=> Should return TRUE or FALSE

利用可能なすべてのキーを一覧表示します

ENV.each do |k, v|
    puts "#{k} is related to #{v}"
end

それがお役に立てば幸いです。

Ruby-DocCore-2.0.0-ENV

于 2013-12-24T03:15:31.270 に答える