При удалении программного обеспечения вы не можете вызвать метод при ошибке выражения с нулевым значением.

Я знаю, что есть другие темы с этим вопросом, но все они включают код, который я не понимаю. Я очень мало разбираюсь в сценариях и ищу кого-нибудь, кто поможет мне дать простой для понимания ответ.

Я пытаюсь удалить программу с помощью PowerShell (в программе нет файла удаления).

Я могу удалить его с помощью Программы и компоненты панели управления, но я хотел бы сделать это удаленно с помощью сеанса PSSession. Итак, после некоторого поиска в Google я нашел следующий сценарий.

Я сначала бегу

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()

Затем я получаю следующую ошибку

You cannot call a method on a null-valued expression.
At C:\Users\Administrator\Desktop\Remote2.ps1:4 char:1
+ $app.Uninstall()
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Может ли кто-нибудь помочь мне, рассказав, что не так, или предоставив правильный код?


person kevin rennenberg    schedule 11.04.2017    source источник


Ответы (2)


Похоже, $app может быть пустой переменной. Я бы добавил временное write-host "app is: $app", прежде чем вы позвоните $app.uninstall(), чтобы проверить, так ли это.

В качестве альтернативы вы можете добавить такую ​​логику:

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)*" 
}
person Mark Wragg    schedule 11.04.2017
comment
Спасибо большое, с оператором -like все заработало! - person kevin rennenberg; 11.04.2017

Вы можете сделать это так, и это будет быстрее. Я предполагаю, что это провайдер msi.

get-package "*OpenOTP-CP (64 bit)*" | uninstall-package
person js2010    schedule 27.09.2020