2015-05-05 41 views
0

如何獲得以下Ruby代碼返回nil,如果regvalue不存在?如何讓這個Ruby代碼返回nil?

現在它正常工作時有什麼回報,但在沒有它吐出了這個錯誤:

Could not retrieve fact='notepadpp', resolution='': The system cannot find the file specified.

如果該項不我希望它只是不能輸出任何東西存在。

Facter.add(:notepadpp) do 
    # restricts module to windows 
    confine :kernel => :windows 
    setcode do 
     require 'facter/util/registry' 

     notepadpp = nil 
     regvalue = Facter::Util::Registry.hklm_read('SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Notepad++', 'Display') 
     notepadpp = regvalue if regvalue && !regvalue.empty? 

     # if regvalue and not regvalue.empty? 
     # notepadpp = regvalue 
     # else nil end 
    end 
end 
+0

期望的行爲在很大程度上取決於'Facter#add'預期接收的內容。你介意鏈接任何文檔嗎? – mudasobwa

+0

這是我擁有的最好的/唯一的[文檔](https://docs.puppetlabs.com/facter/2.4/custom_facts.html)。 – tek0011

回答

1

我沒有乾淨的代碼,一切都突然接到工作:

Facter.add(:notepadpp) do 
    confine :kernel => :windows # restricts module to windows 
    setcode do 
     require 'facter/util/registry' 
     Facter::Util::Registry.hklm_read('...\Notepad++', 'Display') rescue nil 
    end 
end 

#⇒ #<Facter::Util::Fact:0xb907a44 ...> 

功能是不夠聰明返回nil時沒有找到註冊表分支,它可能會拋出一個異常,那麼我們要處理它。

UPD如果你不想除非註冊表項存在要添加的事實:

require 'facter/util/registry' 
reg_value = Facter::Util::Registry.hklm_read('...\Notepad++', 'Display') rescue nil 
Facter.add(:notepadpp) do 
    confine :kernel => :windows # restricts module to windows 
    setcode do 
     regvalue 
    end 
end if regvalue 
+0

謝謝,但仍然失敗 '無法檢索fact ='notepadpp',分辨率='':系統找不到指定的文件.' – tek0011

+0

它在不同的地方失敗。請在此錯誤消息中看到的行中顯示代碼。 – mudasobwa

+0

代碼是你的上面。問題是,如果註冊表項不存在,它將結束代碼流。所以我需要一種方法來處理註冊表變量,如果註冊表項不存在。 – tek0011

2

謝謝!你確實指出了我的方向。讓我知道這是否是一個真正的解決方案,並且我會回答這個問題。我拿了你的代碼,並添加了一個救援。

Facter.add(:notepadpp) do 
    confine :kernel => :windows # restricts module to windows 
    setcode do 
     require 'facter/util/registry' 
     begin 
     Facter::Util::Registry.hklm_read('SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Notepad++', 'DisplayVersion') 
     rescue 
     nil 
     end 
    end 
end