Regedit.exe 导入无法获取“文本”字段

Regedit.exe 导入无法获取“文本”字段

我正在从 Windows XP 迁移到 Windows 7。我使用数据库软件 (Aginity Workbench),它允许用户保存称为“代码片段”的常见查询。这些代码片段存储在注册表中: HKEY_CURRENT_USER\Software\Aginity\NetezzaWorkbench\QueryAnalyzer\CodeSnippets

注册表条目的结构如下,其中“文本”字段存储实际查询: XP_示例

.reg 文本的一部分如下所示:

Windows 注册表编辑器版本 5.00

[HKEY_CURRENT_USER\Software\Aginity\NetezzaWorkbench\QueryAnalyzer\CodeSnippets]

[HKEY_CURRENT_USER\Software\Aginity\NetezzaWorkbench\QueryAnalyzer\CodeSnippets\NZ]

[HKEY_CURRENT_USER\Software\Aginity\NetezzaWorkbench\QueryAnalyzer\CodeSnippets\NZ\1] “触发器”=“sf” “文本”=“选择 *

限制1000;

“CaretPosition”=dword:00000010

[HKEY_CURRENT_USER\Software\Aginity\NetezzaWorkbench\QueryAnalyzer\CodeSnippets\NZ\10] “Trigger”=“rollnode” “Text”=“SELECT mom.varReportId、mom.nodeId、mom.rollupTypeId、roll.riskFactorGroup、roll.effectType、mom.VAR、mom.mean FROM Moments mom、RollupTypeMapping roll WHERE mom.businessDate =(从 SysConfig 中选择 businessDate)AND roll.businessDate = mom.businessDate AND mom.nodeId = 260591 AND mom.varReportId = 'DGV_BT_1D_CAD' AND roll.rollupTypeId = mom.rollupTypeId ORDER BY mom.nodeId、roll.rollupTypeId” “CaretPosition”=dword:0000018c

... 从 Notepad++ 中显示换行详细信息: 注册表_换行符

我尝试通过以下方式迁移代码片段:

  1. 在 XP 上的 regedit.exe 中 >> 导出“代码片段”分支
  2. 在 W7 上的 regexit.exe 中 >> 导入我在 #1 中保存的 .reg 文件

Windows 弹出一条消息,提示注册表已成功更新,实际上我可以看到注册表中出现了新的条目。然而,几乎所有新条目都缺少关键的“文本”字段。例如,这是上面的重要记录“10”: W7_示例

有人能帮忙解释一下如何解决这个问题吗?

我注意到只有一条记录似乎包含文本字段,并且在 W7 中正确填充。我不知道这条记录有什么不同,也不知道为什么 Windows 会以不同的方式处理它。但它确实向我展示了一个可行的示例,并且导入应该是可能的。

Windows XP XP_文本

Windows 7的 W7_文本

答案1

这是回车符/换行符。注册表导入器不喜欢导入包含 EOL/换行符/CR 字符的内容(即使您可以成功导出)。您可以通过查看包含已导入的 TEXT 文件的 .reg 文件部分(TO_CHAR 示例)来验证该理论,我敢打赌它没有回车符。

解决此问题的方法:

  • 出口您想要的注册表项(即:“HKEY_CURRENT_USER\MyTest”): reg export HKEY_CURRENT_USER\MyTest Test.reg
  • 然后节省二进制格式的密钥:reg save HKEY_CURRENT_USER\MyTest Test.bin
  • 然后进口.Reg 文件(在新计算机上)。reg import Test.reg
  • 然后恢复二进制版本在上面:reg restore HKEY_CURRENT_USER\MyTest Test.bin

您必须同时执行这两项操作,因为“恢复”不会重新创建密钥,因此您使用导出/导入的 .Reg 文件来执行该部分,然后将二进制数据(包括换行符等)恢复到那些现在存在的密钥中。

警告:由于我没有可用的 XP,所以我尚未完全测试这一点。

答案2

问题在于换行符。如果修复了这些,它将成功导入。

首先,您缺少换行符:

[HKEY_CURRENT_USER\Software\Aginity\NetezzaWorkbench\QueryAnalyzer\CodeSnippets\NZ\1] "Trigger"="sf" "Text"="select *

这应该是:

[HKEY_CURRENT_USER\Software\Aginity\NetezzaWorkbench\QueryAnalyzer\CodeSnippets\NZ\1] 
"Trigger"="sf" 
"Text"="select *    ...

其次,您有额外的换行符:

"Text"="select *

from

limit 1000;

"

你可能希望将其作为片段,但根据MSDN 上的这篇旧文章,空白行标识新注册表路径的开始。Aginity 可能对这些注册表项中的换行符进行了编码,但在导出过程中丢失了该方案;无论如何,如果您删除空白行,它将成功导入。

这是您发布的 .reg 文件的“修复”版本:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Aginity\NetezzaWorkbench\QueryAnalyzer\CodeSnippets]

[HKEY_CURRENT_USER\Software\Aginity\NetezzaWorkbench\QueryAnalyzer\CodeSnippets\NZ]

[HKEY_CURRENT_USER\Software\Aginity\NetezzaWorkbench\QueryAnalyzer\CodeSnippets\NZ\1] 
"Trigger"="sf" 
"Text"="select * from limit 1000;" 
"CaretPosition"=dword:00000010

[HKEY_CURRENT_USER\Software\Aginity\NetezzaWorkbench\QueryAnalyzer\CodeSnippets\NZ\10] 
"Trigger"="rollnode" 
"Text"="SELECT mom.varReportId, mom.nodeId, mom.rollupTypeId, roll.riskFactorGroup, roll.effectType, mom.VAR, mom.mean FROM Moments mom, RollupTypeMapping roll WHERE mom.businessDate = (select businessDate from SysConfig) AND roll.businessDate = mom.businessDate AND mom.nodeId = 260591 AND mom.varReportId = 'DGV_BT_1D_CAD' AND roll.rollupTypeId = mom.rollupTypeId ORDER BY mom.nodeId, roll.rollupTypeId" 
"CaretPosition"=dword:0000018c

相关内容