WMIC软件版本的If / Else声明

时间:2019-01-18 20:34:53

标签: powershell wmic

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

我的域终于更新了,并允许WinRM在我们的计算机上运行,​​从而使修补程序更容易进行远程操作。我正在工作我的第一个脚本来完成此工作,涉及更新Java。我要做的是使用PowerShell Studio部署脚本,该脚本将杀死Java附加的所有任务,使用wmic查询已安装的Java版本并调用卸载,然后使用Start-Process一个BAT文件,它将进行安装,然后自行清理。发生了什么事,当我在没有Java的机器上运行时,得到“没有可用的实例”。

谷歌搜索并环顾四周,我似乎无法正确理解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版本,它现在将失败。

1 个答案:

答案 0 :(得分:1)

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

对于枚举/杀死进程,请使用Get-Process

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

要查询WMI,请使用Get-WmiObjectGet-CimInstance(后者本质上是前者的现代化版本),除非您真的被迫提高性能。然后,直到那时,您才求助于wmic

但是,对于您的特定任务,一开始就不会使用WMI,因为查询Win32_Product类是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