我正在尝试使用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版本,它现在将失败。
答案 0 :(得分:1)
您的脚本编写方式不太方便。本质上,您只是在PowerShell中运行批处理代码。
对于枚举/杀死进程,请使用Get-Process
:
Get-Process -Name 'chrome', 'iexplore', 'outlook' | ForEach-Object { $_.Kill() }
要查询WMI,请使用Get-WmiObject
或Get-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