You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:43:18