PowerShell操作Windows注册表:HKCR:\*\shell路径识别失败求助
问题分析与解决方案
你的脚本陷入无限运行的核心原因是注册表路径中的错误转义:在单引号包裹的字符串中,*不需要用反引号转义,你添加的反引号会被PowerShell当作路径的一部分,导致尝试创建一个名为\*`的无效注册表键,进而引发操作卡住。
修正步骤
- 移除错误的反引号:将第4、5项的路径中的反引号删除,正确指向
HKCR:\*(所有文件类型的上下文菜单键)。 - 简化HKCR驱动器检查逻辑:原检查代码可以简化,避免冗余判断。
- 可选:聚焦目标文件类型:如果仅需针对
.bat和.cmd,可以删除HKCR:*相关的两项,只保留batfile和cmdfile的配置。
修正后的完整脚本
# 检查HKCR驱动器是否存在,不存在则创建 if (-not (Get-PSDrive -Name HKCR -ErrorAction SilentlyContinue)) { New-PSDrive -PSProvider Registry -Root "HKEY_CLASSES_ROOT" -Name "HKCR" | Out-Null } # 定义注册表项配置(已修正路径) $registryValues = @( @{ Path = 'HKCR:\batfile\shell\Open with\command' Name = '(default)' Value = '{09799AFB-AD67-11d1-ABCD-00C04FC30936}' }, @{ Path = 'HKCR:\batfile\shell\edit\command' Name = '(default)' Value = '"C:\Program Files (x86)\Notepad++\notepad++.exe %1"' }, @{ Path = 'HKCR:\cmdfile\shell\edit\command' Name = '(default)' Value = '"C:\Program Files (x86)\Notepad++\notepad++.exe %1"' }, @{ Path = 'HKCR:\*\shell\Open with Notepad++' Name = 'Icon' Value = 'C:\Program Files (x86)\Notepad++\notepad++.exe' }, @{ Path = 'HKCR:\*\shell\Open with Notepad++\command' Name = '(default)' Value = '"C:\Program Files (x86)\Notepad++\notepad++.exe %1"' } ) # 创建/更新注册表值的函数 function Set-RegistryValue { param( [string]$Path, [string]$Name, [string]$Value ) # 不存在则创建注册表键 if (-not (Test-Path $Path)) { New-Item -Path $Path -Force | Out-Null } # 设置注册表值 New-ItemProperty -Path $Path -Name $Name -Value $Value -PropertyType String -Force } # 批量处理注册表项 foreach ($entry in $registryValues) { Set-RegistryValue -Path $entry.Path -Name $entry.Name -Value $entry.Value }
额外说明
- 如果你仅需要为
.bat和.cmd添加右键菜单,直接删除数组中最后两项(HKCR:*相关的配置)即可。 - 运行脚本需要管理员权限,否则会因注册表写入权限不足报错。
- 若Notepad++安装路径不同(比如64位版本在
C:\Program Files\Notepad++),需对应修改Value中的路径。
内容的提问来源于stack exchange,提问作者Kenneth Matthys
相关产品推荐
相关产品推荐

