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: ...
最新文章
- 10条影响CSS渲染速度的写法与建议
- 洛谷P2158仪仗队(数学,观察找规律,欧拉函数)
- python加粗_python – 设置为使用标记加粗选定的文本
- rust(19)-进制
- python3 批量定义多个变量_Python 3.8 新功能大揭秘
- eclipse让实现类也添加上接口的注释_您的Spring框架注释指南,请注意查收
- TensorFlow windows安装
- 「代码随想录」动态规划:关于完全背包,你该了解这些!
- python3.5中文手册chm_python3官方帮助文档-python3.5.2官方chm参考手册-东坡下载
- 常用Fragstats景观指数
- 参考文献查阅网站大全
- 内蒙古自治区包头市谷歌高清卫星地图下载
- android仿微信图片编辑库,Android仿微信朋友圈添加图片
- 浅谈IPv6网络安全问题及解决对策
- 为什么 call 比 apply 快?
- 网络分层和对应的协议列表
- 【stm32f4 C++与C混合开发】建立keil5的ARM Compiler 6(AC6)标准库开发工程
- 转自Avan_Lau
- Python数据分析报告:北京市每月PM2.5的值和分析影响PM2.5
- 如有定义int a=128; 则输出语句printf(“%o”,a);的输出结果为?。
热门文章
- iphone android 朋友圈,最近很火的微信空白朋友圈发布教程!安卓、苹果通用!
- ubuntu16.04+cuda8.0+cudnn5.1+caffe 安装(基于独立主机集成显卡GTX1080Ti)
- 什么是涉密信息系统?
- latex表格单元格内换行
- 10行代码爬取英雄联盟皮肤全套。6不6?
- 【算法】将数组循环左移
- Matlab图形x轴和y轴插入标注
- 中国式家长怎么学计算机,中国式家长前期怎么学习 中国式家长前期学习攻略...
- web前端(JavaScript)
- 国际web短信软件平台开发搭建后台功能|移讯云短信系统