PowerShell处理注册表REG_BINARY时Sort-Object -Unique无法去重排序怎么解决
PowerShell注册表REG_BINARY转文本并排序去重方案
问题根因
原有脚本的核心问题是:替换逻辑生成的是带换行的单个字符串对象,而非每条路径独立的字符串数组,Sort-Object -Unique无法识别单条路径边界,自然无法实现去重和按字母排序的效果。同时没有过滤REG_BINARY类型的键,遇到其他类型的键值时会出现转码异常。
可直接命令行执行的修正代码
& { $paths = @(); Get-ChildItem -Path 'HKCU:SOFTWARE\000' -Recurse | ForEach-Object { $regKey = $_; $regKey.Property | ForEach-Object { $val = $regKey.GetValue($_); $type = $regKey.GetValueKind($_); if ($type -eq 'Binary') { [System.Text.Encoding]::Unicode.GetString($val) -split "`0" | Where-Object { $_ -match ':' -and $_ } | ForEach-Object { $paths += $_.Trim() } } } }; $paths | Sort-Object -Unique }
逻辑说明
- 仅过滤REG_BINARY类型的键值处理,避免非二进制值报错
- 转码后直接按Unicode字符串的结束符
\0分割多路径,比逐字母匹配盘符的替换逻辑更稳定 - 所有路径存入统一数组后再调用
Sort-Object -Unique,可正确实现去重+字母升序排序
测试验证
导入提供的Test.reg后执行上述代码,输出结果如下:
A:\Test\A.zip\ C:\Test\A.zip\ C:\Test\B.zip\ C:\Test\C.zip\ C:\Test\D.zip\ D:\Test\B.zip\ O:\Test\D.zip\
完全符合去重、按字母排序的要求。
内容的提问来源于stack exchange,提问作者Humberto Freitas
相关产品推荐
相关产品推荐

