软件版本的 WMIC If / Else 语句

WMIC If / Else Statement for Software Version

我正在尝试使用 PowerShell 移动安装文件、卸载任何以前版本的软件、删除安装目录并执行 BAT 文件。

我的域终于更新并允许 WinRM 在我们的机器上 运行,这使得远程修补变得更加容易。我正在编写我的第一个脚本来执行此操作,涉及更新 Java。我想做的是使用 PowerShell Studio 部署一个脚本,这个脚本将杀死所有 Java 附加的任务,使用 wmic 查询安装的 Java 版本并调用卸载,然后 Start-Process 一个 BAT 文件,它将执行安装,然后自行清理。发生的事情是当我 运行 进入一台没有 Java 的机器时,我得到 "No Instance(s) Available".

谷歌搜索和环顾四周,我似乎无法正确理解 If / Else 语句,正在寻求帮助。

taskkill /F /IM iexplorer.exe
taskkill /F /IM chrome.exe
taskkill /F /IM outlook.exe

wmic product where "name like 'Java%%'" call uninstall /nointeractive

Start-Process -FilePath 'C:\Suppot\Java\java.bat' -Verb runas -Wait

RD /S /Q "C:\support\java"

我希望看到机器更新并在后台安静地安装 Java,刷新控制面板以在测试中验证它是否有效。

发生的事情是代码中有错误,卸载成功了,但之后失败了。在接下来的 运行 中,它现在会在找不到要删除的 Java 版本时失败。

您的脚本编写方式不是很 PoSh。本质上,您只是 运行PowerShell 中的批处理代码。

对于 enumerating/killing 进程使用 Get-Process:

Get-Process -Name 'chrome', 'iexplore', 'outlook' | ForEach-Object { $_.Kill() }

要查询 WMI,您将使用 Get-WmiObjectGet-CimInstance(后者本质上是前者的现代版本),除非您 真的 性能压力。然后,也只有那时,你才会求助于 wmic.

但是,对于您的特定任务,一开始就不会使用 WMI,因为查询 Win32_Product class 是 considered harmful。相反,在注册表中查找卸载字符串,拆分该字符串,然后通过 Start-Process 运行 它。将参数 /qn 添加到参数字符串以进行无人值守删除。

$path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'
Get-ChildItem $path | ForEach-Object {
    Get-ItemProperty -Path $_.PSPath | Where-Object {
        $_.DisplayName -like '*java*'
    } | ForEach-Object {
        $cmd, $params = $_.UninstallString -split ' ', 2
        Start-Process $cmd -ArgumentList "${params} /qn" -Wait
    }
}

可以使用 Remove-Item:

删除文件和文件夹
Remove-Item 'C:\support\java' -Recurse -Force