如何使用Powershell删除所有Oracle Java

时间:2018-11-26 22:36:43

标签: powershell

我首先要说我确实读过其他一些话题,但是在这一点上我仍然必须做(决定要高于我的薪水等级)。

我们正在迁移和测试Azul java,以了解它对我们的效果如何。同时,我需要弄清楚如何编写所有Oracle java卸载的脚本(最好是为JRE提供一个脚本,为JDK提供另一个脚本)。

当前我如何删除Java版本是通过列出所有执行msiexec /x "GUID of the java version" /qn的jre版本来完成的,但是这非常耗时,所以我想实用地获取这些字符串。

现在我运行以下命令:

Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -like 'Java*'}

enter image description here

但是,我试图找出只要供应商= Oracle Corporation,如何自动为每个结果获取IdentifyNumber并将其通过管道传递给msiexec命令以有问题地删除它们。 Azul与命令正在运行但未显示在同一系统上(这很好,但是以防万一我想拥有供应商限定符)。

我的问题是:假设供应商是Oracle Corporation,有人可以帮助我将产品的IdentifyNumber传递到msiexec命令中

谢谢。

更新1: 遵循Drew和Ansgar的反馈

$Source = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*
$Uninstall = $Source | Where-Object {($_.Publisher -like '*Oracle*')-and ($_.DisplayName -like 'Java*')} | select UninstallString
$UninstallString = $Uninstall.UninstallString
$UninstallSting | ForEach-Object{Invoke-Expression -ScriptBlock ($UninstallString)}

但是,随着不断获取,我似乎无法正确地传递字符串:

Invoke-Command : Cannot convert 'System.Object[]' to the type 'System.Management.Automation.ScriptBlock' required by parameter 'ScriptBlock'. Specified method 
is not supported.
At C:\Konstantin\Java\UninstallAllJava.ps1:8 char:62
+ ... ting | ForEach-Object{Invoke-Command -ScriptBlock ($UninstallString)}
+                                                       ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.InvokeCommandCommand

2 个答案:

答案 0 :(得分:1)

我建议使用注册表方法。

public ChainedHashTable( int capacity )
{
    int arraySize = HashTable.nextPrime((int) (1.1 * capacity));
    table= (Dictionary<K, V>[]) new Dictionary[arraySize];
    for ( int i = 0; i < arraySize; i++ )
        table[i] = new OrderedDoubleList<K,V>();
    maxSize = capacity;
    currentSize = 0;} 

这将为您提供Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.Publisher -like '*oracle*'} | select UninstallString 链接。例如。 MsiExec.exe

答案 1 :(得分:0)

所以我能够弄清楚,所以这是我想出的似乎可行的方法

  

将“源”变量设置为注册表位置

$Source = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*
  

设置“卸载”变量以从源继承,并将范围缩小到Oracle和Java

$Uninstall = $Source | Where-Object {($_.Publisher -like '*Oracle*')-and ($_.DisplayName -like 'Java*')} | select UninstallString
  

设置“ UninstallString”变量以仅从“ Uninstall”变量获取卸载字符串

$UninstallStrings = $Uninstall.UninstallString -replace "MsiExec.exe ","MsiExec.exe /qn " -replace "/I","/X"
  

运行所有卸载字符串

ForEach($UninstallString in $UninstallStrings){& cmd /c "$UninstallString"}

我相信它可以使它清洁得多,但这是我目前能做的最好的事情。对于某些版本的Java,卸载字符串将给出/ i变量而不是/ x(JDK 6),这就是为什么我必须执行第二个replace语句。

示例:

UninstallString                                     
---------------                                     
MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F03217079FF}
MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F83216045FF}
MsiExec.exe /I{32A3A4F4-B792-11D6-A78A-00B0D0160450}