2015-03-27 3 views
1

Я создаю скрипт PowerShell для проверки локальной системы для предопределенного списка GUID (IdentifyingNumber), которые принадлежат JRE. Целью является удаление любых старых версий, которые являются частью списка, перед установкой последней версии Java.Powershell сравнить массив, чтобы проверить GUID

Сценарий работает корректно для соответствия GUID, но когда я запускаю msiexec.exe /x в цикле for 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 

ответ

1

Вы вызываете все процессы msiexec в одно и то же время. Установщик Windows/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" 
} 
.... 
+0

Благодарим вас за то, что спасли мне головную боль. Это решение отлично работало. –

Смежные вопросы