如何创建 wmic powershell 脚本

How to create wmic powershell script

我对 powershell 命令还很陌生,我正努力朝着能够创建简单脚本的方向前进。例如,我正在编写一个脚本,该脚本将按顺序 运行 以下命令:

命令 1:wmic

命令 2:product where name="Cloud Workspace Client" call uninstall /nointeractive

第二个命令取决于第一个命令运行。但是,我不确定如何实现能够成功执行此操作的脚本。我只知道单个命令,但不知道如何将它们串在一起。

任何帮助、建议或资源链接都将不胜感激!

正如 Ansgar 所提到的,在 PowerShell 中有处理 WMI classes 的本机方法。所以使用 wmic.exe 被认为是不好的做法。有趣的是,编写了导致 PowerShell 的 Monad 宣言的 Jeffrey Snover 也致力于 wmic.exe

用于 WMI 的 PowerShell cmdlet 是 WMI cmdlet,但在 PowerShell 3.0 和更新版本中有更好的 CIM cmdlet。这是您可以对 WMI 查询返回的对象调用 Uninstall 方法的一种方法。

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

但是... Win32_Product class 是臭名昭著的,因为每次调用它时,它都会强制对所有 msi 安装程序进行一致性检查。因此,最佳做法是查看注册表中的 Uninstall 键并使用那里的信息。这需要更多工作,但不会导致一致性检查。

#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 cmdlet。

Get-Package 'Cloud Workspace Client' | Uninstall-Package