导致错误的原因"You cannot call a method on a null-valued expression."



我正在尝试创建一个脚本,该脚本将卸载变量$packages 中列出的软件

当运行我的代码时,我会出现以下错误,无法确定是什么原因导致了这种情况。

You cannot call a method on a null-valued expression.
At line:7 char:3
+   $app.Uninstall()
+   ~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

软件包中的一些项目会卸载,但不是全部,如果我在开始时添加一个额外的假软件包,那么它们都会卸载,并为那个假软件包产生相同的错误,这让我有点困惑为什么会发生这种情况。

我的代码是

$packages = @("Package 1 (Transport) TEST", "Package 2 TEST", "Package 3 TEST", "Package 4 
TEST", "Package 5 TEST", "Package 6 TEST", "Package 7 TEST", "Package 8 TEST", "Package 9 
TEST", "Package 10 TEST", "Package 11 TEST", "Package 12 TEST")
foreach($package in $packages){
$app = Get-WmiObject -Class Win32_Product | Where-Object {
$_.Name -match "$package"
}
$app.Uninstall()
}

如有任何帮助,将不胜感激

该错误意味着没有被分配给$app-换句话说,没有满足Where-Object条件$_.Name -match "$package"Win32_Product的可发现实例。

您可以稍微重写代码以检查$app是否有值:

foreach($package in $packages){
$app = Get-WmiObject -Class Win32_Product | Where-Object {
$_.Name -match "$package"
}
# Let's make sure we actually got something
if($app){
$app.Uninstall()
}
}

或者,也许最好对$app可能包含的0个或多个对象进行另一个循环(在包名称与多个已安装产品匹配的情况下(:

foreach($package in $packages){
$apps = Get-WmiObject -Class Win32_Product | Where-Object {
$_.Name -match "$package"
}
# if `$apps` is empty/$null, the loop will simply run 0 times :) 
foreach($app in $apps){
$app.Uninstall()
}
}

Mathias answer解决了我的错误问题,但我遇到了另一个问题,因为某种原因没有找到其中一个包。(我怀疑这是由于包裹名称中的括号(

我修改了我的脚本如下,在我的用例中,我希望从同一个视频卸载所有东西,所以这对我来说很好。

$app = Get-WmiObject -Class Win32_Product | Where-Object {$_.Vendor -match "[Vendor Name]"}
$app.Uninstall()

相关内容

最新更新