powershell批量替换注册表
起因是我公司的电脑在初始化用户名时用了花名(别往),所以用户文件夹命名为中文,由此导致了python、ruby无法加载自身模块(因为他们的模块放在当前用户的文件夹下,这样路径就带了中文,就会报编码异常)。
然后我通过教程新建另一个管理员来修改当前用户文件夹名为拼音后再修改注册表指定的用户文件夹
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
,再删除新增的管理员这样的操作来修改了用户文件夹名并使计算机正常运行但是后来发现很多vscode等右键菜单无法使用,环境变量也需要改变,因为他们的注册表路径仍是旧的
C:\Users\别往
而不是C:\Users\biewang
,需要用批量修改替换注册表的路径,然而微软的注册表目前并不提供批量替换功能,只能自己查找手动替换,网上也没有方法因此作为工程师,没有方法就自己做方法,我的想法是用powershell脚本查询注册表中匹配的数据再对ta进行修改
注意事项
1.windows默认编码为GBK,否则中文简本乱码
2.注册表修改有风险,注意备份,或者debug实验,在我本地运行是ok的但是可能会有其他bug
3.全局替换时匹配的数据不能太短,不然容易改到其他不应该改的东西导致无法开机
4.如果涉及修改注册表需要管理员权限开启的powershell来执行
5.如果powershell无法执行脚本,按照提示开启权限(需要管理员)
Set-ExecutionPolicy RemoteSigned
本地机器脚本执行权限设置为下载的脚本需要签名
get-ExecutionPolicy -list
查看
开发
regedit.psm1
注册表函数模块,主要封装修改注册表方法和写日志防止出错
#设置注册表并日志
function SetAndLong($Path,$Name,$Value,$OldValue){#Requires -RunAsAdministrator$command="Set-ItemProperty -Path $Path -Name $Name -Value $Value "+';$?'$status=iex $commandif ($status){"$(Get-Date) $command oldvalue $OldValue" |Out-File -Append -Encoding $(if ($PSVersionTable.PSVersion.Major -ge 6){"utf8NoBOM"}else{"utf8"}) -FilePath "regchange.log"}}#替换注册表https://stackoverflow.com/questions/26680410/powershell-find-and-replace-on-registry-values#
function RegistryValue-Replace([string]$path = $(throw "path为必填(即注册表路径)"),[string]$NewValue = $(throw "NewValue为必填(即替换的值)"),[string]$key, #可选为指定键[string]$OldValue, #OldValue可选(即当前值),有则进行校验[ScriptBlock]$DoMethod #DoMethod可选,自定义处理函数){Get-Item -ErrorAction SilentlyContinue -path "Microsoft.PowerShell.Core\Registry::$path"|foreach {Get-ItemProperty -Path "Microsoft.PowerShell.Core\Registry::$_" | foreach {$CurrentUserShellFoldersPath = $_.PSPath$_.PSObject.Properties |foreach {if (![String]::IsNullOrEmpty($key) -and !($_.name -like $key) ){ #键校验return}if (![String]::IsNullOrEmpty($OldValue) -and !($_.Value -eq $OldValue)){ #旧值校验return}if ($DoMethod -ne $Null){$DoMethod.invoke($_,$CurrentUserShellFoldersPath)return}SetAndLong -Path $CurrentUserShellFoldersPath -Name $_.Name -Value $newValue -OldValue $_.Value}}}
}# 测试
# RegistryValue-Replace "HKCR\Installer\Products\744364B64946E5F42B50D57B45FC3471\SourceList" "test" -DoMethod {param($Propert) $Propert.Name} #回调测试
# RegistryValue-Replace "HKCR\Installer\Products\744364B64946E5F42B50D57B45FC3471\SourceList" "test" -key "LastUsedSource" #指定key测试
# RegistryValue-Replace "HKCR\Installer\Products\744364B64946E5F42B50D57B45FC3471\SourceList" "test" -OldValue "MfeEEPc64.msi" #指定旧值测试
# RegistryValue-Replace "HKCR\Installer\Products\744364B64946E5F42B50D57B45FC3471\SourceList" -key "LastUsedSource" "MfeEEPc64.msi" #常规赋值还原
regDataBatchChange.ps1
批量修改脚本
# 脚本用于扫描替换注册表值,比如修改用户文件夹名后
Import-Module .\regedit.psm1 #引入脚本
$replaceKey=@('C:\Users\别往','C:\Users\biewang') #C:\Users\别往 替换为 C:\Users\biewang
# check param num
if ($replaceKey.count -ne 2)
{throw "参数不匹配,replaceKey需要两个参数"
}
$re=$replaceKey[0] -replace "\\","\\"
# query regdata
function Shell-Do(){#遍历注册表5个根项Foreach($hkey in @('HKCR','HKCU','HKLM','HKU','HKCC')) {$querydata=reg query $hkey /s /d /f $replaceKey[0] #HKCR HKCU HKLM HKU HKCC[regex]::matches($querydata,'(?m)(?<path>\S+) {5}\S+ {4}\S+ {4}') |foreach{RegistryValue-Replace $_.Groups['path'].value $null -DoMethod {param($Propert,[string]$path)if ($Propert.Value -match $re){$new=$Propert.Value -replace $re,$replaceKey[1]SetAndLong -Path "'$path'" -Name "`"$($Propert.Name)`"" -Value "'$new'" -OldValue "$($Propert.Value)"}}}}
}Shell-Do
结果
替换了4280个项,会在运行脚本的位置生成日志文件regchange.log
记录成功修改的路径、新值、旧值,以下给出部分日志:
06/01/2021 12:35:08 Set-ItemProperty -Path 'Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\{f684de81-73c2-4924-ad43-e7ae400d47b5}' -Name "BundleCachePath" -Value 'C:\Users\biewang\AppData\Local\Package Cache\{f684de81-73c2-4924-ad43-e7ae400d47b5}\python-3.7.0-amd64.exe' ;$? oldvalue C:\Users\别往\AppData\Local\Package Cache\{f684de81-73c2-4924-ad43-e7ae400d47b5}\python-3.7.0-amd64.exe
06/01/2021 12:35:08 Set-ItemProperty -Path 'Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\{f684de81-73c2-4924-ad43-e7ae400d47b5}' -Name "DisplayIcon" -Value 'C:\Users\biewang\AppData\Local\Package Cache\{f684de81-73c2-4924-ad43-e7ae400d47b5}\python-3.7.0-amd64.exe,0' ;$? oldvalue C:\Users\别往\AppData\Local\Package Cache\{f684de81-73c2-4924-ad43-e7ae400d47b5}\python-3.7.0-amd64.exe,0
06/01/2021 12:35:08 Set-ItemProperty -Path 'Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\{f684de81-73c2-4924-ad43-e7ae400d47b5}' -Name "ModifyPath" -Value '"C:\Users\biewang\AppData\Local\Package Cache\{f684de81-73c2-4924-ad43-e7ae400d47b5}\python-3.7.0-amd64.exe" /modify' ;$? oldvalue "C:\Users\别往\AppData\Local\Package Cache\{f684de81-73c2-4924-ad43-e7ae400d47b5}\python-3.7.0-amd64.exe" /modify
其他
Q: 为什么不生成*.reg文件,这样方便出错回滚
A: 因为reg export
导出reg文件时对于hex类型中文会乱码,不方便匹配中文,还有其他未知数据类型不好处理,如果理解了脚本自己写逻辑回滚也很快,综合评判我的空余时间不支持这样做,如果有兴趣可以去尝试
powershell批量替换注册表相关推荐
- Powershell 批量替换文件
Powershell 批量替换文件 ##作者:Xiongpq ##时间:2015-06-10 18:50 ##版本:2.0##源文件目录 ##源文件目录的所有文件都会覆盖目标目录的同名文件,源文件目录 ...
- mysql 批量替换 所有表_[收藏]批量替换一个数据库中所有表中所有记录
/***********批量替换一个数据库中所有表中所有记录************/ declare @delStr nvarchar(500) set @delStr='这里是要替换的字符' /* ...
- 批量删除注册表特定键值的小技巧
今天使用虚拟机的时候发现了一个小的问题,我的ubunto需要使用18.04,但是我用的虚拟机是版本12的,不能正常加载,但是在别人的电脑上就能成功,看他们的版本是15.0的所以我也想吧我的虚拟机升级到 ...
- Windows注册表脚本文件(简介、添加、修改、删除)
简介 我们平时大多采用Regedit注册表编辑器来实现对注册表的修改操作,但是这种手工操作费时费力,当你要对多台PC统一修改注册表时,就要怨念了.并且在某些情况下,如果注册表编辑器被禁用了,那么这种方 ...
- 电脑服务器注册表,电脑注册表怎么清理 服务器安全狗清理注册表教程
我们在安装一些软件的时候经常会增加一些注册表,有些软件还会修改我们系统本身的注册表,有时候卸载的时候卸载的不是很干净,久而久之注册表的垃圾文件就会越来越多,这个时候清理我们的电脑注册表就很有必要了,那 ...
- win10控制面板快捷键_在win10打开注册表编辑器的七种方法,你知道几种
注册表编辑器是一种Windows操作系统工具,旨在查看和更改Windows系统注册表中的设置,其中包含有关硬件和软件的信息和设置.用户配置文件以及操作系统界面的各种设置.本文介绍了在Windows 1 ...
- 注册表备份和恢复(转)
注册表备份和恢复(转) ★★★注册表备份和恢复 1:手工备份Windows的注册表 在9X/Me中 方法一:在9X/Me系统中我们要备份的是System.dat和User.dat这两个文件,我们可以把 ...
- windows 注册表脚本文件 添加 修改 删除 简介
目录 1. 简介 2. 创建REG文件 3. REG语法 3.1 基本语法 3.2 删除操作语法 3.3 重命名操作语法 4. 编辑REG文件 5. 补充知识 1. 简介 我们平时大多采用Regedi ...
- 7. PowerShell -- Provider,数据操作和注册表操作
PowerShell Provider 什么是Provider 实际上是一个动态链接库(.dll),在PowerShell中也称为"管理单元", MSDNS上定义的类库:http: ...
最新文章
- ansible的条件判断、迭代执行、tags
- c#与WMI使用技巧集
- Lync 小技巧-42-动态-IP-统一沟通-环境-IP-变更后-操作
- hdu 2255二分图最大权值匹配的KM 算法
- matlab 小波变换_连续小波变换实现方法的总结及其程序详解
- 每日一笑 | 我写了一段代码,为什么不能运行呢?
- YOLOV5目标检测-后处理NMS(非极大值抑制)
- 3dmax:3dmax三维建模中常用的材质、贴图、渲染设置之详细攻略
- 第二周——团队项目(小小大佬带飞队)
- Android带动画进度条简单实现
- 好的计算机书籍 http://outmyth.blogdriver.com/outmyth/1122212.html
- 【软件工程】 软件工程及开发模型
- 信息安全学习----渗透测试知识点
- python 获取巨量星图数据
- java 多维数组 分配空间的方法
- 启动SOLIDWORKS2020显示无法获得下列许可SOLIDWORKS Standard 无法连接到服务器(-15,10,10061)的解决办法
- springboot打印出sql语句【伸手党福利】
- 在FlashBuilder里的ActionScript工程中使用Flash CS5中的类 fl.controls库
- Android 最新状态栏处理
- RTP协议基本分析(RTSP、WebRTC使用)