软件版本的 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-WmiObject
或 Get-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
我正在尝试使用 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-WmiObject
或 Get-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