Powershell 比较数组以检查 GUID
Powershell compare array to check for GUID
我正在创建一个 PowerShell 脚本来检查本地系统是否有属于 JRE 的 GUID
(IdentifyingNumber) 的预定义列表。目的是在安装 Java.
的最新版本之前删除列表中的所有旧版本
脚本似乎 运行 正确匹配 GUID
但是当我 运行 msiexec.exe /x
在我的 for 循环和 if 语句中它只 运行在脚本完成之前执行一次。它应该删除找到的每个旧版本。
如果有人可以帮助解释我在这里缺少的是什么,将不胜感激!
[string[]] $Java_GUIDS = @(
#Java Auto Updater
"{4A03706F-666A-4037-7777-5F2748764D10}",
#Java 8 Update 31 - 64-bit
"{26A24AE4-039D-4CA4-87B4-2F86418031F0}",
#Java 8 Update 31 - 32-bit
"{26A24AE4-039D-4CA4-87B4-2F83218031F0}",
#Java 8 Update 25 - 64-bit
"{26A24AE4-039D-4CA4-87B4-2F83218025F0}",
#Java 8 Update 20 - 32-bit
"{26A24AE4-039D-4CA4-87B4-2F83218020F0}",
#Java 8 Update 20 - 64-bit
"{26A24AE4-039D-4CA4-87B4-2F83218020FF}",
# ARRAY DEFINITION TRUNCATED
#Java 5 Update 22
"{3248F0A8-6813-11D6-A77B-00B0D0150220}",
#Java 5 Update 23
"{3248F0A8-6813-11D6-A77B-00B0D0150230}")
#Show currently installed Java Version(s)
Write-Host "Currently Installed Java Versions:"
gwmi win32_product -filter "name like 'Java%'" | select name,IdentifyingNumber,Version
[string[]] $Installed = (gwmi win32_product -filter "name like 'Java%'" | Select-Object -expand IdentifyingNumber)
foreach($Installed_GUID in $Installed)
{
if ($Java_GUIDS -contains $Installed_GUID)
{
Write-Host "Found $Installed_GUID in Java GUIDS Array. Removing..."
msiexec.exe /x $Installed_GUID /qn /norestart /L*V "C:\Windows\TEMP\Java Removal.log"
Write-Host "Done"
}
else
{
Write-Host "Did NOT find $Installed_GUID in Java GUIDS Array"
}
}
Write-Host "Complete"
下面是三个连续的 运行 脚本,显示每个 运行 只有一个版本被成功卸载。
PS C:\Users\srj3> C:\Users\srj3\Desktop\Java_Removal.ps1
Currently Installed Java Versions:
name IdentifyingNumber Version
---- ----------------- -------
Java 7 Update 75 {26A24AE4-039D-4CA4-87B4-2F03217075FF} 7.0.750
Java 8 Update 31 {26A24AE4-039D-4CA4-87B4-2F83218031F0} 8.0.310
Java 8 Update 25 {26A24AE4-039D-4CA4-87B4-2F83218025F0} 8.0.250
Java 7 Update 75 (64-bit) {26A24AE4-039D-4CA4-87B4-2F06417075FF} 7.0.750
Java 8 Update 31 (64-bit) {26A24AE4-039D-4CA4-87B4-2F86418031F0} 8.0.310
Java Auto Updater {4A03706F-666A-4037-7777-5F2748764D10} 2.8.31.13
Found {26A24AE4-039D-4CA4-87B4-2F03217075FF} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F83218031F0} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F83218025F0} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F06417075FF} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F86418031F0} in Java GUIDS Array. Removing...
Done
Found {4A03706F-666A-4037-7777-5F2748764D10} in Java GUIDS Array. Removing...
Done
Complete
PS C:\Users\srj3> C:\Users\srj3\Desktop\Java_Removal.ps1
Currently Installed Java Versions:
name IdentifyingNumber Version
---- ----------------- -------
Java 8 Update 31 {26A24AE4-039D-4CA4-87B4-2F83218031F0} 8.0.310
Java 8 Update 25 {26A24AE4-039D-4CA4-87B4-2F83218025F0} 8.0.250
Java 7 Update 75 (64-bit) {26A24AE4-039D-4CA4-87B4-2F06417075FF} 7.0.750
Java 8 Update 31 (64-bit) {26A24AE4-039D-4CA4-87B4-2F86418031F0} 8.0.310
Java Auto Updater {4A03706F-666A-4037-7777-5F2748764D10} 2.8.31.13
Found {26A24AE4-039D-4CA4-87B4-2F83218031F0} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F83218025F0} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F06417075FF} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F86418031F0} in Java GUIDS Array. Removing...
Done
Found {4A03706F-666A-4037-7777-5F2748764D10} in Java GUIDS Array. Removing...
Done
Complete
PS C:\Users\srj3> C:\Users\srj3\Desktop\Java_Removal.ps1
Currently Installed Java Versions:
name IdentifyingNumber Version
---- ----------------- -------
Java 8 Update 25 {26A24AE4-039D-4CA4-87B4-2F83218025F0} 8.0.250
Java 7 Update 75 (64-bit) {26A24AE4-039D-4CA4-87B4-2F06417075FF} 7.0.750
Java 8 Update 31 (64-bit) {26A24AE4-039D-4CA4-87B4-2F86418031F0} 8.0.310
Java Auto Updater {4A03706F-666A-4037-7777-5F2748764D10} 2.8.31.13
Found {26A24AE4-039D-4CA4-87B4-2F83218025F0} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F06417075FF} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F86418031F0} in Java GUIDS Array. Removing...
Done
Found {4A03706F-666A-4037-7777-5F2748764D10} in Java GUIDS Array. Removing...
Done
Complete
您正在同时调用所有 msiexec 进程。 Windows Installer/Msiexec 一次只允许一个事务,因此您需要等待每个进程完成才能开始下一个。
....
if ($Java_GUIDS -contains $Installed_GUID)
{
Write-Host "Found $Installed_GUID in Java GUIDS Array. Removing..."
#Defining the command here to make it clean. One object per word (split at whitespace).
$argumentlist = @('/x', $Installed_GUID, '/qn', '/norestart', '/l*v', '"C:\Windows\TEMP\Java Removal.log"')
Start-Process -FilePath msiexec.exe -ArgumentList $argumentlist -Wait
Write-Host "Done"
}
....
我正在创建一个 PowerShell 脚本来检查本地系统是否有属于 JRE 的 GUID
(IdentifyingNumber) 的预定义列表。目的是在安装 Java.
脚本似乎 运行 正确匹配 GUID
但是当我 运行 msiexec.exe /x
在我的 for 循环和 if 语句中它只 运行在脚本完成之前执行一次。它应该删除找到的每个旧版本。
如果有人可以帮助解释我在这里缺少的是什么,将不胜感激!
[string[]] $Java_GUIDS = @(
#Java Auto Updater
"{4A03706F-666A-4037-7777-5F2748764D10}",
#Java 8 Update 31 - 64-bit
"{26A24AE4-039D-4CA4-87B4-2F86418031F0}",
#Java 8 Update 31 - 32-bit
"{26A24AE4-039D-4CA4-87B4-2F83218031F0}",
#Java 8 Update 25 - 64-bit
"{26A24AE4-039D-4CA4-87B4-2F83218025F0}",
#Java 8 Update 20 - 32-bit
"{26A24AE4-039D-4CA4-87B4-2F83218020F0}",
#Java 8 Update 20 - 64-bit
"{26A24AE4-039D-4CA4-87B4-2F83218020FF}",
# ARRAY DEFINITION TRUNCATED
#Java 5 Update 22
"{3248F0A8-6813-11D6-A77B-00B0D0150220}",
#Java 5 Update 23
"{3248F0A8-6813-11D6-A77B-00B0D0150230}")
#Show currently installed Java Version(s)
Write-Host "Currently Installed Java Versions:"
gwmi win32_product -filter "name like 'Java%'" | select name,IdentifyingNumber,Version
[string[]] $Installed = (gwmi win32_product -filter "name like 'Java%'" | Select-Object -expand IdentifyingNumber)
foreach($Installed_GUID in $Installed)
{
if ($Java_GUIDS -contains $Installed_GUID)
{
Write-Host "Found $Installed_GUID in Java GUIDS Array. Removing..."
msiexec.exe /x $Installed_GUID /qn /norestart /L*V "C:\Windows\TEMP\Java Removal.log"
Write-Host "Done"
}
else
{
Write-Host "Did NOT find $Installed_GUID in Java GUIDS Array"
}
}
Write-Host "Complete"
下面是三个连续的 运行 脚本,显示每个 运行 只有一个版本被成功卸载。
PS C:\Users\srj3> C:\Users\srj3\Desktop\Java_Removal.ps1
Currently Installed Java Versions:
name IdentifyingNumber Version
---- ----------------- -------
Java 7 Update 75 {26A24AE4-039D-4CA4-87B4-2F03217075FF} 7.0.750
Java 8 Update 31 {26A24AE4-039D-4CA4-87B4-2F83218031F0} 8.0.310
Java 8 Update 25 {26A24AE4-039D-4CA4-87B4-2F83218025F0} 8.0.250
Java 7 Update 75 (64-bit) {26A24AE4-039D-4CA4-87B4-2F06417075FF} 7.0.750
Java 8 Update 31 (64-bit) {26A24AE4-039D-4CA4-87B4-2F86418031F0} 8.0.310
Java Auto Updater {4A03706F-666A-4037-7777-5F2748764D10} 2.8.31.13
Found {26A24AE4-039D-4CA4-87B4-2F03217075FF} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F83218031F0} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F83218025F0} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F06417075FF} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F86418031F0} in Java GUIDS Array. Removing...
Done
Found {4A03706F-666A-4037-7777-5F2748764D10} in Java GUIDS Array. Removing...
Done
Complete
PS C:\Users\srj3> C:\Users\srj3\Desktop\Java_Removal.ps1
Currently Installed Java Versions:
name IdentifyingNumber Version
---- ----------------- -------
Java 8 Update 31 {26A24AE4-039D-4CA4-87B4-2F83218031F0} 8.0.310
Java 8 Update 25 {26A24AE4-039D-4CA4-87B4-2F83218025F0} 8.0.250
Java 7 Update 75 (64-bit) {26A24AE4-039D-4CA4-87B4-2F06417075FF} 7.0.750
Java 8 Update 31 (64-bit) {26A24AE4-039D-4CA4-87B4-2F86418031F0} 8.0.310
Java Auto Updater {4A03706F-666A-4037-7777-5F2748764D10} 2.8.31.13
Found {26A24AE4-039D-4CA4-87B4-2F83218031F0} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F83218025F0} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F06417075FF} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F86418031F0} in Java GUIDS Array. Removing...
Done
Found {4A03706F-666A-4037-7777-5F2748764D10} in Java GUIDS Array. Removing...
Done
Complete
PS C:\Users\srj3> C:\Users\srj3\Desktop\Java_Removal.ps1
Currently Installed Java Versions:
name IdentifyingNumber Version
---- ----------------- -------
Java 8 Update 25 {26A24AE4-039D-4CA4-87B4-2F83218025F0} 8.0.250
Java 7 Update 75 (64-bit) {26A24AE4-039D-4CA4-87B4-2F06417075FF} 7.0.750
Java 8 Update 31 (64-bit) {26A24AE4-039D-4CA4-87B4-2F86418031F0} 8.0.310
Java Auto Updater {4A03706F-666A-4037-7777-5F2748764D10} 2.8.31.13
Found {26A24AE4-039D-4CA4-87B4-2F83218025F0} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F06417075FF} in Java GUIDS Array. Removing...
Done
Found {26A24AE4-039D-4CA4-87B4-2F86418031F0} in Java GUIDS Array. Removing...
Done
Found {4A03706F-666A-4037-7777-5F2748764D10} in Java GUIDS Array. Removing...
Done
Complete
您正在同时调用所有 msiexec 进程。 Windows Installer/Msiexec 一次只允许一个事务,因此您需要等待每个进程完成才能开始下一个。
....
if ($Java_GUIDS -contains $Installed_GUID)
{
Write-Host "Found $Installed_GUID in Java GUIDS Array. Removing..."
#Defining the command here to make it clean. One object per word (split at whitespace).
$argumentlist = @('/x', $Installed_GUID, '/qn', '/norestart', '/l*v', '"C:\Windows\TEMP\Java Removal.log"')
Start-Process -FilePath msiexec.exe -ArgumentList $argumentlist -Wait
Write-Host "Done"
}
....