Показать полную графическую версию : [решено] Удаление 1с
Доброго времени суток, уважаемые.
Нашел в инете 2 очень похожих способа удаления 1с через PS:
1) Рабочий
$app = Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -match «1c»}
$app.Uninstall()
2) Выдает ошибку
(Get-WmiObject Win32_Product -Filter "Name = '1С:Предприятие 8 (8.3.8.2197)'").Uninstall()
Ошибка:
Нельзя вызвать метод для выражения со значением NULL.
строка:1 знак:89
+ (Get-WmiObject Win32_Product -Filter "Name = '1С:Предприятие 8 (8.3.8.2197)'").Uninstall <<<< ()
+ CategoryInfo : InvalidOperation: (Uninstall:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Может кто-нибудь разъяснить, почему не работает 2 способ?
И как можно удалить программу, которая не отображается через
Get-WmiObject Win32_Product -List
Может кто-нибудь разъяснить, почему не работает 2 способ? »
Например, потому, что запрос Wbem возвращает пустой набор. То бишь, Ваш фильтр:
… -Filter "Name = '1С:Предприятие 8 (8.3.8.2197)'" … »
не находит ни одного подходящего экземпляра класса Win32_Product.
Впрочем, первый способ ничем не лучше, и так же чреват возможными ошибками исполнения.
И как можно удалить программу, которая не отображается через »
Тупо перебирать в реестре машинный и пользовательские разделы Software\Microsoft\Windows\CurrentVersion\Uninstall, разбирать и отправлять на исполнение строку, содержащуюся в параметре UninstallString.
Впрочем, первый способ ничем не лучше, и так же чреват возможными ошибками исполнения. »
Так может есть какой-нибудь стандартный более простой и верный способ?
Тупо перебирать в реестре машинный и пользовательские разделы Software\Microsoft\Windows\CurrentVersion\Uninstall, разбирать и отправлять на исполнение строку, содержащуюся в параметре UninstallString. »
Посмотрел эти разделы, перебирать их я так понял нужно потому что некоторые программы ставятся в Programm Files, а другие в профиль пользователя? А что значит разбирать UninstallString, там ведь прописан путь к деинсталятору с параметрами, или есть нюансы?
Так может есть какой-нибудь стандартный более простой и верный способ? »
Да способ всё тот же, хоть с фильтрацией по -Filter, хоть с командлетом Where-Object. Просто надо либо проверять, что в коллекции возвращается хотя бы один объект (как это принято делать красиво и правильно — я не знаю, плохо умею работать с PowerShell), либо тупо перебирать все возвращённые объекты по ForEach-Object — из пустой коллекции до ForEach-Object просто не дойдёт ничего.
перебирать их я так понял нужно потому что некоторые программы ставятся в Programm Files, а другие в профиль пользователя? »
Ну, тут скорее наоборот — потому что приложения могут быть установлены либо в режиме «на машину» (оно же «для всех пользователей») — и именно потому обычно располагаются в %ProgramFiles%, либо в режиме «на пользователя» (конкретного) — и потому, как правило, располагаются в профиле пользователя; причина — режим установки, а месторасположение — следствие выбранного режима установки приложения.
А что значит разбирать UninstallString, там ведь прописан путь к деинсталятору с параметрами, или есть нюансы? »
Скажем, может просто не быть параметра UninstallString как такового ;). Тип параметра UninstallString может быть как REG_SZ, так и REG_EXPAND_SZ (и тут Вам смотреть — доверить расрытие возможных переменных окружения системе, запрашивая параметр типа REG_EXPAND_SZ как REG_SZ, либо делать это самому). Где-то уже есть кавычки:
"C:\Program Files\WinHTTrack\unins000.exe"
где-то — нет (но зато есть пробелы в пути и параметры):
C:\Program Files\Windows Firewall Control\wfc.exe -uninstall
Вот я про что.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.