编写PowerShell脚本为未加引号的UninstallString注册表值添加引号
解决PowerShell脚本重复添加引号的问题
我一眼就看出问题出在哪啦!你原来的脚本里用了-contains来判断字符串是否包含引号,但这个运算符是用来检查数组是否包含某个元素的,不是用来判断字符串里有没有子串的——这就导致判断逻辑失效,哪怕已经有引号的项也会被错误处理。
修正后的脚本
Get-ChildItem HKLM:\SOFTWARE\test -Recurse -ErrorAction SilentlyContinue | ForEach-Object { # 获取UninstallString值,避免无此属性的项报错 $uninstallString = Get-ItemPropertyValue -Path $_.PsPath -Name UninstallString -ErrorAction SilentlyContinue # 仅当值存在且完全不包含双引号时,才添加引号 if ($uninstallString -and $uninstallString -notlike '*"*') { # 用双引号包裹原字符串(符合Windows卸载项的标准格式) Set-ItemProperty -Path $_.PsPath -Name UninstallString -Value "`"$uninstallString`"" } }
关键改动说明
- 修复判断逻辑:把错误的
-contains换成-notlike '*"*',这是PowerShell里判断字符串是否不包含指定子串的正确方式 - 增加空值检查:
$uninstallString -and确保我们只处理存在UninstallString属性的注册表项,避免空值报错 - 可读性优化:把变量名从
$g改成$uninstallString,脚本更易懂 - 标准引号格式:用双引号包裹值(Windows程序的卸载字符串通常用双引号,如果你需要单引号,把
""$uninstallString""改成"'$uninstallString'"`即可)
额外验证提示
如果你想先预览要修改的项、避免误操作,可以把Set-ItemProperty换成Write-Host先测试:
Get-ChildItem HKLM:\SOFTWARE\test -Recurse -ErrorAction SilentlyContinue | ForEach-Object { $uninstallString = Get-ItemPropertyValue -Path $_.PsPath -Name UninstallString -ErrorAction SilentlyContinue if ($uninstallString -and $uninstallString -notlike '*"*') { Write-Host "将修改项: $($_.PsPath) 的值从 '$uninstallString' 改为 `"`"$uninstallString`"`"" } }
内容的提问来源于stack exchange,提问作者RaWneZ
相关产品推荐
相关产品推荐

