我首先要说我确实读过其他一些话题,但是在这一点上我仍然必须做(决定要高于我的薪水等级)。
我们正在迁移和测试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*'}
但是,我试图找出只要供应商= 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
答案 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}