我正在从 Windows XP 迁移到 Windows 7。我使用数据库软件 (Aginity Workbench),它允许用户保存称为“代码片段”的常见查询。这些代码片段存储在注册表中:
HKEY_CURRENT_USER\Software\Aginity\NetezzaWorkbench\QueryAnalyzer\CodeSnippets
.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++ 中显示换行详细信息:
我尝试通过以下方式迁移代码片段:
- 在 XP 上的 regedit.exe 中 >> 导出“代码片段”分支
- 在 W7 上的 regexit.exe 中 >> 导入我在 #1 中保存的 .reg 文件
Windows 弹出一条消息,提示注册表已成功更新,实际上我可以看到注册表中出现了新的条目。然而,几乎所有新条目都缺少关键的“文本”字段。例如,这是上面的重要记录“10”:
有人能帮忙解释一下如何解决这个问题吗?
我注意到只有一条记录似乎包含文本字段,并且在 W7 中正确填充。我不知道这条记录有什么不同,也不知道为什么 Windows 会以不同的方式处理它。但它确实向我展示了一个可行的示例,并且导入应该是可能的。
答案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