注册表项的重命名项抛出错误并创建副本而不是重命名
Rename-Item for registry key throws error and creates a copy instead of rename
我已经为此挠头好几个小时了。我猜这可能与我正在使用 Powershell 运行 的帐户的权限有关(不太可能,因为我使用既是本地管理员又是域管理员的帐户登录服务器),或者密钥以某种方式被另一个进程使用。我查看了 this Stack post as well as this Reddit thread but for some reason this only works for empty keys that I create for testing purposes, not the existing ones. There seems to be others having similar issues too 没有成功。
有效的测试
我创建了一个名为 HKLM:\Software\MyTestKey 的注册表项,然后我 运行:
Get-Item 'HKLM:\Software\MyTestKey'
这个returns:
Hive: HKEY_LOCAL_MACHINE\SOFTWARE
Name Property
---- --------
MyTestKey
那么我运行:
Rename-Item 'HKLM:\Software\MyTestKey' -NewName "MyNewTestKey"
这 运行 是正确的,我可以验证密钥 MyTestKey 已重命名为 MyNewTestKey。如果注册表项中有空格,这也有效。
测试无效
然后我转向已安装软件的现有密钥。该软件的服务已停止。我运行
Get-Item 'HKLM:\Software\MySoftware\KeyToChangeName'
这个returns正确:
Hive: HKEY_LOCAL_MACHINE\SOFTWARE\MySoftware
Name Property
---- --------
KeyToChangeName
然而,当我运行
Rename-Item 'HKLM:\Software\MySoftware\KeyToChangeName' -NewName "MyNewKeyname"
这会引发错误:
Rename-Item : The registry key at the specified path does not exist.
At line:1 char:1
+ Rename-Item 'HKLM:\SOFTWARE\MySoftware\KeyToChangeName...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (HKEY_LOCAL_MACH...ame|MyDomainName:String) [Rename-Item], ArgumentException
+ FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.RenameItemCommand
最奇怪的是,Powershell 没有重命名密钥,而是创建了密钥的副本,所以现在我同时拥有 KeyToChangeName 和 MyNewKeyname。
到目前为止已尝试的命令
- 重命名项目 'HKLM:\Software\MySoftware\KeyToChangeName' -新名称 "MyNewKeyname"
- 重命名项目'HKLM:\Software\MySoftware\KeyToChangeName' -NewName MyNewKeyname
- 重命名项目 "HKLM:\Software\MySoftware\KeyToChangeName" -新名称 "MyNewKeyname"
- 重命名项目"HKLM:\Software\MySoftware\KeyToChangeName" -NewName MyNewKeyname
所有这些都会导致抛出相同的错误,但它仍然会创建密钥的副本,而不是重命名它。我还为上述所有命令尝试了同时使用 -Path 和 -LiteralPath 标志的 Move-Item,但结果相同。
为什么 powershell 告诉我密钥不存在,而它显然不存在?更奇怪的是,为什么它会创建一个与旧注册表项内容相同的新注册表项,本质上是复制它,而不是重命名它?
感谢任何帮助。
好的,我找到了解决方案:在尝试重新打开 Powershell 会话、重新登录到计算机、执行 ipconfig /flushdns 以及 /release 和 /renew 之后,我意识到我有多个服务器 运行在环境中,所有人都使用相同的软件,并且所有服务器都使用该软件相互连接。重新启动所有服务器并停止所有 运行 服务器上的软件服务后,我能够正确使用 Rename-Item 和 Move-Item。
其他服务器上的软件正在使用我服务器上的注册表项,这使我无法重命名它们。然而,由于父密钥未被使用或被软件锁定,我被允许创建与我试图重命名的密钥并行的新密钥。这就是为什么它让旧密钥保留当前名称,但它也用新名称创建了一个新密钥。就我个人而言,我认为 Powershell 应该已经因 Rename-Item 而失败并且不会创建重复项,但如果我怀疑是这样,那么 Rename-Item 实际上是一个 Copy-Item 后跟一个 Remove-Item(在这种情况下,Copy 有效但随后的删除失败)。
我已经为此挠头好几个小时了。我猜这可能与我正在使用 Powershell 运行 的帐户的权限有关(不太可能,因为我使用既是本地管理员又是域管理员的帐户登录服务器),或者密钥以某种方式被另一个进程使用。我查看了 this Stack post as well as this Reddit thread but for some reason this only works for empty keys that I create for testing purposes, not the existing ones. There seems to be others having similar issues too 没有成功。
有效的测试
我创建了一个名为 HKLM:\Software\MyTestKey 的注册表项,然后我 运行:
Get-Item 'HKLM:\Software\MyTestKey'
这个returns:
Hive: HKEY_LOCAL_MACHINE\SOFTWARE
Name Property
---- --------
MyTestKey
那么我运行:
Rename-Item 'HKLM:\Software\MyTestKey' -NewName "MyNewTestKey"
这 运行 是正确的,我可以验证密钥 MyTestKey 已重命名为 MyNewTestKey。如果注册表项中有空格,这也有效。
测试无效
然后我转向已安装软件的现有密钥。该软件的服务已停止。我运行
Get-Item 'HKLM:\Software\MySoftware\KeyToChangeName'
这个returns正确:
Hive: HKEY_LOCAL_MACHINE\SOFTWARE\MySoftware
Name Property
---- --------
KeyToChangeName
然而,当我运行
Rename-Item 'HKLM:\Software\MySoftware\KeyToChangeName' -NewName "MyNewKeyname"
这会引发错误:
Rename-Item : The registry key at the specified path does not exist.
At line:1 char:1
+ Rename-Item 'HKLM:\SOFTWARE\MySoftware\KeyToChangeName...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (HKEY_LOCAL_MACH...ame|MyDomainName:String) [Rename-Item], ArgumentException
+ FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.RenameItemCommand
最奇怪的是,Powershell 没有重命名密钥,而是创建了密钥的副本,所以现在我同时拥有 KeyToChangeName 和 MyNewKeyname。
到目前为止已尝试的命令
- 重命名项目 'HKLM:\Software\MySoftware\KeyToChangeName' -新名称 "MyNewKeyname"
- 重命名项目'HKLM:\Software\MySoftware\KeyToChangeName' -NewName MyNewKeyname
- 重命名项目 "HKLM:\Software\MySoftware\KeyToChangeName" -新名称 "MyNewKeyname"
- 重命名项目"HKLM:\Software\MySoftware\KeyToChangeName" -NewName MyNewKeyname
所有这些都会导致抛出相同的错误,但它仍然会创建密钥的副本,而不是重命名它。我还为上述所有命令尝试了同时使用 -Path 和 -LiteralPath 标志的 Move-Item,但结果相同。
为什么 powershell 告诉我密钥不存在,而它显然不存在?更奇怪的是,为什么它会创建一个与旧注册表项内容相同的新注册表项,本质上是复制它,而不是重命名它?
感谢任何帮助。
好的,我找到了解决方案:在尝试重新打开 Powershell 会话、重新登录到计算机、执行 ipconfig /flushdns 以及 /release 和 /renew 之后,我意识到我有多个服务器 运行在环境中,所有人都使用相同的软件,并且所有服务器都使用该软件相互连接。重新启动所有服务器并停止所有 运行 服务器上的软件服务后,我能够正确使用 Rename-Item 和 Move-Item。
其他服务器上的软件正在使用我服务器上的注册表项,这使我无法重命名它们。然而,由于父密钥未被使用或被软件锁定,我被允许创建与我试图重命名的密钥并行的新密钥。这就是为什么它让旧密钥保留当前名称,但它也用新名称创建了一个新密钥。就我个人而言,我认为 Powershell 应该已经因 Rename-Item 而失败并且不会创建重复项,但如果我怀疑是这样,那么 Rename-Item 实际上是一个 Copy-Item 后跟一个 Remove-Item(在这种情况下,Copy 有效但随后的删除失败)。