Как создать скрипт wmic powershell

Я новичок в командах powershell и пытаюсь перейти к созданию простых скриптов. Например, я работаю над скриптом, который будет запускать следующие команды по порядку:

Команда 1: wmic

Команда 2: продукт, где name="Cloud Workspace Client" вызывает удаление /nointeractive

Вторая команда зависит от первой команды, запускаемой первой. Однако я не уверен, как реализовать сценарий, который успешно это сделает. Я знаю только отдельные команды, но не знаю, как связать их вместе.

Буду очень признателен за любую помощь, предложения или ссылки на ресурсы!


person Ty Flo    schedule 21.12.2017    source источник
comment
Это просто: вы не делаете. Способ работы PoSh с WMI: Get-WmiObject.   -  person Ansgar Wiechers    schedule 22.12.2017


Ответы (1)


Как упомянул Ансгар, в PowerShell есть собственные способы обработки классов WMI. Поэтому использование wmic.exe считается плохой практикой. Интересно, что Джеффри Сновер, написавший манифест монад, который привел к PowerShell, также работал над wmic.exe.

Командлеты PowerShell для работы с WMI — это командлеты WMI, но в PowerShell 3.0 и новее есть командлеты CIM, которые еще лучше. Вот один из способов вызвать метод Uninstall для объекта, возвращаемого запросом WMI.

(Get-WMIObject Win32_Product -Filter 'name="Cloud Workspace Client"').Uninstall()

Но… класс Win32_Product печально известен тем, что каждый раз, когда вы его вызываете, он вызывает проверку согласованности для всех установщиков msi. Поэтому лучше всего заглянуть в Удалить ключ в реестре и использовать информацию там. Это больше работы, но не вызывает проверку согласованности.

#Uninstall Key locations
$UninstallKey = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\"
$Uninstall32Key = "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"

#Find all of the uninstall keys
$AllUninstallRegistryKeys = @($(Get-ChildItem $uninstallkey),$(Get-ChildItem $uninstall32key -ErrorAction SilentlyContinue))

#Get the properties of each key, filter for specific application, store Uninstall property
$UninstallStrings = $AllUninstallRegistryKeys | ForEach-Object {
    Get-ItemProperty $_.pspath | Where-Object {$_.DisplayName -eq 'Cloud Workspace Client'}
} | Select-Object -ExpandProperty UninstallString
#Run each uninstall string
$UninstallStrings | ForEach-Object { & $_ }

Более того, если у вас есть PowerShell 5+, теперь есть командлеты PackageManagement.

Get-Package 'Cloud Workspace Client' | Uninstall-Package
person BenH    schedule 22.12.2017
comment
Вау, спасибо за всю помощь. Погружение в powershell может быть ошеломляющим. По вашему совету я обновился с Poweshell v2 до v5.1. и подтвердил, что скрипт get-package работает. Я собираюсь продолжить изучение PowerShell, просматривая онлайн-статьи и посещая курсы Microsoft Virtual Academy. Спасибо еще раз! - person Ty Flo; 22.12.2017