2009-12-15 60 views
5

我正在創建一個MSBuild任務,它將讀取特定註冊表項的註冊表。如果我在控制檯應用程序中編寫相同的代碼行(請參閱下文),它將返回預期結果,但是當它位於MSBuild任務中時,它不返回任何內容。如何使用自定義msbuild任務讀取註冊表值?

Return Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\", "SQLPath", Nothing) 

我希望上面的代碼返回Nothing如果鍵/值對不存在的,如果它存在返回值。當MSBuild任務得到執行時,我得到Nothing。是否有一些屬性需要應用於MSBuild任務的Execute函數,以告知它需要讀取註冊表?

編輯:

這裏是正在從MSBuild任務執行:

​​

我beleive這個由Registry Redirector我在32位運行的MSBuild Vista x64的機器上造成的。有沒有什麼辦法可以告訴自定義MSBuild任務(用VB .Net編寫)查看HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\,那麼只有在沒有任何東西存在的情況下,再看看HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Setup\

謝謝

斯科特藍

+0

您是否嘗試過像RegMon這樣的工具,以確保您在讀取MSBuild命中時正確的註冊表項?可能會發生一些32位/ 64位的嗡嗡聲? – 2009-12-15 05:13:48

+0

不錯的想法,我會看看... – Scott 2009-12-15 05:14:42

+0

因此,'RegMon'被'Process Monitor'所替代,它報告說當我使用控制檯應用程序來讀取註冊表時,它是通過TestingRegistry成功讀取的。 exe(程序名稱)。但是當我運行這個任務時,它使用了顯示devenv.exe作爲調用應用程序,並且實際上是試圖打開這個鍵:HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ MSSQLServer \ Setup,並得到一個'NAME NOT FOUND'錯誤。爲什麼它會在'Wow6432Node'元素中添加路徑? – Scott 2009-12-15 05:33:42

回答

0

如何使用VB的If()三元函數?

Function GetSqlPathFromReg() As Object 
    Return If(Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\", "SQLPath", Nothing), _ 
       Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Setup\", "SQLPath", Nothing)) 
End Function 

假設你有一個Output()屬性:

Private _sqlPath As String 

<Output()> _ 
Public ReadOnly Property SqlPath() As String 
    Get 
     Return _sqlPath 
    End Get 
End Property 

然後,所有你需要做的就是從Execute()方法調用它:

_sqlPath = GetSqlPathFromReg().ToString() 
+0

好想法,但不起作用。由於註冊表重定向器,「HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MSSQLServer \ Setup \」會自動轉換爲HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ MSSQLServer \ Setup \',因此您的解決方案實際上是: 'Return If .GetValue(「HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ MSSQLServer \ Setup \」,「SQLPath」,Nothing),_ Registry.GetValue(「HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ MSSQLServer \ Setup \」,「SQLPath」,沒有))' Wow6432Node是自動注入的。 – Scott 2009-12-16 15:08:21

+0

也許你只需要看看不同的位置,看到這個: http://support.microsoft.com/kb/936491 – KMoraz 2009-12-17 12:35:31

12

您可以直接從的MSBuild讀取註冊表,沒有自定義任務,如下所示:

$(registry:Hive\MyKey\[email protected]) 

例如,

$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\) 

你說,你正在尋找從一個自定義任務做到這一點,所以這可能並不適用,但我張貼的情況下,它可以幫助。

+0

但它適用於我!謝謝。 – 2017-06-26 04:03:50

1

我們的msbuild腳本從x86 Visual Studio命令提示符運行。使用此語法時,它不會讀取64位註冊表。它有不同的語法,可以讓x86讀取64位註冊表?