2015-03-31 2 views
0

я написал сценарий деинсталлировать Java из Windows 7 машин:РЕШИТЬ: Powershell: Msiexec/X бросает ошибку 1619, когда вызов из сценария

[...] 
$p2=start-process "msiexec.exe" -arg "/X $uninstall32 /qn REMOVE=ALL /norestart " -PassThru -wait -verb runAs 
$p2.WaitForExit() 
[...] 

где, как $uninstall32 = {26A24AE4-039D-4CA4-87B4-2F03217065FF}

, если я называю этот PS1 файл как администратор напрямую, все пошло хорошо. В порядке обновления процесса я должен вызвать мой (рабочий) файл ps1 из файла .bat. это звонит мой ps1 файл таким образом

if exist "%programfiles%\java\jre7" (

    powershell.exe -NoProfile -Command "Set-ExecutionPolicy Bypass" 
    powershell.exe -NoProfile -file %~dp0uninstalljava7.ps1 
    powershell.exe -NoProfile -Command "Set-ExecutionPolicy "restricted" 
) 

затем erythin идут неправильно: Msiexec бросает 1619?

Я не понимаю?

EDIT:

а, для меня рабочего раствора:

Set-StrictMode -Version 2 

$uninstall32key = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" 
$uninstall64key = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" 

$hklm32 = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry32) 
$hklm64 = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry64) 

$key32 = $hklm32.OpenSubKey($uninstall32key) 
$key64 = $hklm64.OpenSubKey($uninstall64key) 

$subkeys32 = $key32.GetSubKeyNames() 
$subkeys64 = $key64.GetSubKeyNames() 


foreach($subkey in $subkeys32) 
{ 
    $key = $hklm32.OpenSubKey($uninstall32key+"\\"+$subkey) 
    $displayName = $key.GetValue("DisplayName") 

    if ($displayName -match "Java 7") 
    { 
     $uninstall32 =$key.GetValue("UninstallString") 
     if ($uninstall32) { 
     $uninstall32 = $uninstall32 -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X","" 
     $params = @{ 
      "FilePath" = "$Env:SystemRoot\system32\msiexec.exe" 
      "ArgumentList" = @(
       "/x" 
       $uninstall32 
       "/qn" 
       "REMOVE=ALL" 
       "/norestart" 
      ) 
      "Verb" = "runas" 
      "PassThru" = $true 
      } 
      $app1 = start-process @params 
      $app1.WaitForExit() 
     } 
    } 
} 

foreach($subkey in $subkeys64) 
{ 
    $key = $hklm64.OpenSubKey($uninstall64key+"\\"+$subkey) 
    $displayName = $key.GetValue("DisplayName") 

    if ($displayName -match "Java 7") 
    { 
     $uninstall64 =$key.GetValue("UninstallString") 
     if ($uninstall64) { 
     $uninstall64 = $uninstall64 -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X","" 
     $params = @{ 
      "FilePath" = "$Env:SystemRoot\system32\msiexec.exe" 
      "ArgumentList" = @(
       "/x" 
       $uninstall64 
       "/qn" 
       "REMOVE=ALL" 
       "/norestart" 
      ) 
      "Verb" = "runas" 
      "PassThru" = $true 
      } 
      $app1 = start-process @params 
      $app1.WaitForExit() 
     } 
    } 
} 

Спасибо за все предложения.

+0

это означает, что файл или пакет не доступен или действительным для установки, если вы используете только Powershell скрипт для тестового пути просто использовать 'Test-path' и для сценария запуска' Powershell -noexit "&" "путь к сценарию" " – powershell

+0

powershell -noexit" & "" путь к скрипту "" ", не помогает -> 1619 –

+0

Как в стороне, [PowerShell.exe имеет ExecutionPolicy] (https: // technet .microsoft.com/en-us/library/hh847736.aspx) для сеанса, поэтому вам не нужно менять его ширину машины, а затем менять ее. –

ответ

1

Try это так:

$appGUID = "{26A24AE4-039D-4CA4-87B4-2F03217065FF}" 
$params = @{ 
    "FilePath" = "$Env:SystemRoot\system32\msiexec.exe" 
    "ArgumentList" = @(
    "/x" 
    $appGUID 
    "/qn" 
    "REMOVE=ALL" 
    "/norestart" 
) 
    "Verb" = "runas" 
    "PassThru" = $true 
} 
$app = start-process @params 
$app.WaitForExit() 
0

Кроме того, параметр start-process -ArgumentList (Alias: -arg в вашем примере) принимает значение ARRAY параметров. Передача одной строки не работает должным образом.

Попробуйте так:

$Args = @("/X", "$uninstall32", "/qn", "REMOVE=ALL", "/norestart") 
$p2=start-process "msiexec.exe" -argumentList $args -PassThru -wait -verb runAs 

Кроме того, если символ доллара в "$ Uninstall32" является параметром для установки, вы должны написать его между простыми кавычками: '$ uninstall32'

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

  • Нет связанных вопросов^_^