Я почесал голову от этого уже несколько часов. Я предполагаю, что это может быть связано либо с разрешениями для учетной записи, с которой я запускаю Powershell (маловероятно, поскольку я вошел на сервер с учетной записью, которая является как локальным администратором, так и администратором домена), или что ключ каким-то образом используется другим процессом. Я посмотрел этот пост в стеке , а также эту ветку Reddit , но по какой-то причине это работает только для пустых ключей, которые я создаю для целей тестирования, а не для существующих. Похоже, что другие тоже сталкиваются с подобными проблемами , но безуспешно.
Тест, который работает
Я создал раздел реестра с именем HKLM: \ Software \ MyTestKey, а затем я запускаю:
Get-Item 'HKLM:\Software\MyTestKey'
Это возвращает:
Hive: HKEY_LOCAL_MACHINE\SOFTWARE
Name Property
---- --------
MyTestKey
Итак, я запускаю:
Rename-Item 'HKLM:\Software\MyTestKey' -NewName "MyNewTestKey"
Это работает правильно, и я могу проверить что ключ MyTestKey был переименован в MyNewTestKey. Это также работает, если в разделе реестра есть пробелы.
Тест, который не работает
Затем я обращаюсь к существующему ключу для программного обеспечения, которое я установил. Служба для этого программного обеспечения остановлена. Я запускаю
Get-Item 'HKLM:\Software\MySoftware\KeyToChangeName'
Это возвращает правильно:
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' -NewName "MyNewKeyname"
- Переименовать-Item 'HKLM: \ Software \ MySoftware \ KeyToChangeName' -NewName MyNewName MyNewName MyNewName
- Переименовать-элемент "HKLM: \ Software \ MySoftware \ KeyToChangeName" -NewName "MyNewKeyname"
- Переименовать-элемент "HKLM: \ Software \ MySoftware \ KeyToChangeName" -NewName MyNewKeyname
Все это приводит к одной и той же ошибке, но все равно создает копию ключа, а не переименовывает его. Я также попробовал Move-Item с флагами -Path и -LiteralPath для всех вышеперечисленных команд, но с одинаковыми результатами.
Почему PowerShell сказал мне, что ключ не существует, когда он явно не существует? т? И даже более странно, зачем ему создавать новый раздел реестра с тем же содержимым, что и у старого, дублируя его, а не переименовывать?
Любая помощь приветствуется.