Powershell的Copy-Item在文件系统和注册表上提供了不一致的结果

时间:2014-05-20 16:39:55

标签: powershell copy-item

我正在尝试使用带有Copy-Item-Recurse参数的Powershell -Force命令行开关从一个注册表项复制设置,并在另一个键中覆盖相同的设置(如果存在)。如果我在文件系统上使用相同的命令,那么源和目标中存在的任何文件夹都将被覆盖在目标中。

但是,在注册表上使用此命令时,如果目标中存在密钥,则会将源密钥复制为子项。例如:

开始状态:

HKCU:Software\OldVendor\Program  
HKCU:Software\OldVendor\Program\Setting1  
HKCU:Software\OldVendor\Program\Setting2  

HKCU:Software\NewVendor\Program  
HKCU:Software\NewVendor\Program\Setting1  
HKCU:Software\NewVendor\Program\Setting2  

现在,如果我运行此命令:

Copy-Item -Path "HKCU:Software\OldVendor\Program" -Destination "HKCU:Software\NewVendor" -Recuse -Force

我希望保持相同的结构。实际上,NewVendor下的结构如下所示:

HKCU:Software\NewVendor\Program  
HKCU:Software\NewVendor\Program\Setting1  
HKCU:Software\NewVendor\Program\Setting1\Setting1  
HKCU:Software\NewVendor\Program\Setting2  
HKCU:Software\NewVendor\Program\Setting2\Setting2 

有谁能告诉我如何让Powershell覆盖现有的注册表项,而不是复制到子项?

1 个答案:

答案 0 :(得分:-1)

在我看来,你想要复制项目及其值,这些是属性,而不是键。您可以按如下方式列出它们:

get-itemproperty "HKCU:Software\NewVendor\Program" 

或者您可以使用别名并省略引号:

gp HKCU:Software\NewVendor\Program 

另一种更好的方法,它不会查看PowerShell特定的属性:

Get-Item HKLM:\SOFTWARE\NewVendor\Program | select -ExpandProperty Property

因此,如果您想将所有属性从一个键复制到另一个键:

Get-Item HKLM:\SOFTWARE\Program | select -ExpandProperty Property | % {Copy-ItemProperty -Path HKLM:\SOFTWARE\Program -Destination HKLM:\SOFTWARE\AnotherProgram -Name $_ -Verbose}

您必须使用foreach循环,因为Copy-ItemProperty cmdlet只能复制一个已指定的属性。