[英]What is causing the error “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 中的一些项目将卸载但不是全部,如果我在开始时添加一个额外的假包,那么它们将全部卸载并为该假包产生相同的错误,这让我有点困惑为什么会发生这种情况。
我的代码是
$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
- 换句话说,没有可发现的Win32_Product
实例满足Where-Object
条件$_.Name -match "$package"
。
您可以稍微重写您的代码以检查$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 的回答解决了我的错误问题,但是我还有一个问题,即由于某种原因没有找到其中一个包。 (我怀疑这是由于包名称中的括号)
我修改了我的脚本,如下所示,在我的用例中,我希望卸载同一个 vedor 中的所有内容,因此这对我来说很好用。
$app = Get-WmiObject -Class Win32_Product | Where-Object {$_.Vendor -match "[Vendor Name]"}
$app.Uninstall()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.