2009-12-15 61 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位注册表?