【问题标题】:When removing software "you cannot call a method on a null-valued expressions" error删除软件时“您不能在空值表达式上调用方法”错误
【发布时间】:2017-04-11 09:33:19
【问题描述】:

我知道这个问题还有其他线程,但它们都涉及我不理解的代码。我对脚本知之甚少,我正在寻找可以帮助我提供易于理解的答案的人。

我正在尝试使用 PowerShell 删除程序(该程序没有卸载程序文件)。

我可以使用控制面板 → 程序和功能将其删除,但我想使用 PSSession 远程执行此操作。所以在谷歌上搜索后,我找到了以下脚本。

我先跑

Get-WmiObject -Class Win32_Product | Select-Object -Property Name

这让我得到了我要删除的程序的名称:“OpenOTP-CP(64 位)”

然后我运行脚本:

$app = Get-WmiObject -Class Win32_Product | Where-Object { 
    $_.Name -match "OpenOTP-CP (64 bit)" 
}
$app.Uninstall()

然后我得到以下错误

您不能在空值表达式上调用方法。 在 C:\Users\Administrator\Desktop\Remote2.ps1:4 char:1 + $app.卸载() + ~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull

有人可以告诉我哪里出了问题或提供正确的代码来帮助我吗?

【问题讨论】:

    标签: powershell scripting windows-server-2012-r2


    【解决方案1】:

    听起来$app 可能是一个空变量。在您致电 $app.uninstall() 之前,我会添加一个临时的 write-host "app is: $app" 以检查是否是这种情况。

    或者,您可以添加一些这样的逻辑:

    If ($app){
        $app.Uninstall()
    }else{
        write-host "app was not found"
    }
    

    $app 可能为空的原因是因为-match 运算符使用正则表达式,因此很可能将括号视为特殊字符。尝试使用 -like 而不是 -match 并用星号包围它:

    $app = Get-WmiObject -Class Win32_Product | Where-Object { 
        $_.Name -like "*OpenOTP-CP (64 bit)*" 
    }
    

    【讨论】:

    • 非常感谢,使用 -like 运算符,它工作了!
    【解决方案2】:

    你可以这样做,它会更快。我假设它是一个 msi 提供程序。

    get-package "*OpenOTP-CP (64 bit)*" | uninstall-package
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      相关资源
      最近更新 更多