2012-06-12 106 views
1

我遇到了msiexec用Powershell刪除java的問題。我輸出了我的結果命令到屏幕上,並將其粘貼到一個批處理文件中,並且運行良好。但是當它通過Powershell執行時,它會失敗,說「找不到包」。任何人都可以發現我可能做錯了什麼嗎?我一直在上下查找谷歌,並嘗試了幾種不同的方式來執行命令,不帶成功和相同的結果。用msiexec Powershell卸載程序

cls 
$java = Get-WmiObject -Class win32_product | where { $_.Name -like "*Java*"} 
$msiexec = "c:\windows\system32\msiexec.exe"; 
#$msiexecargs = '/x:"$app.LocalPackage" /qr' 
$msiexecargs = '/uninstall "$app.IdentifyingNumber" /qr /norestart' 

if ($java -ne $null) 
{ 
    foreach ($app in $java) 
    { 
     write-host $app.LocalPackage 
     write-host $app.IdentifyingNumber 
     #&cmd /c "msiexec /uninstall $app.IdentifyingNumber /passive" 
     #Start-Process -FilePath $msiexec -Arg $msiexecargs -Wait -Passthru 
     [Diagnostics.Process]::Start($msiexec, $msiexecargs); 
    } 
} 
else { Write-Host "nothing to see here..." } 
Write-Host "check end" 

目標是使用Windows 7登錄腳本在最終用戶系統上刪除所有版本的Java,然後安裝最新版本。我更喜歡把它全部製作成Powershell,但是如果我不能得到這個工作,我將只使用一個批處理文件,用硬編碼的卸載GUID的

寫主機語句都是爲了調試的目的, m只是對msiexec執行這種格式的一些變化感興趣:msiexec/x {GUID}/passive/norestart

我得到的錯誤是: 「這個安裝包無法打開,請檢查包是否存在並且您可以訪問它,或與應用程序供應商聯繫以確認這是一個有效的Windows安裝程序包。「

我知道它自己的作品,只是不在這個腳本...所以我認爲這是一個語法的東西。

如果您有任何問題,請告訴我。

回答

0

首先你要知道這之間的區別:

"$app.IdentifyingNumber" 

"$($app.IdentifyingNumber)" 

所以我想你想使用後者(代碼是有點混亂,因爲的註釋行):

&cmd /c "msiexec /uninstall $($app.IdentifyingNumber) /passive" 
+0

對不起,我想展示我在代碼中嘗試的其他內容。我可以從哪裏獲得有關您所做修改的更多信息?這工作得很好。謝謝! – grep65535

+0

我認爲http://blogs.msdn.com/b/powershell/archive/2006/07/15/variable-expansion-in-strings-and-herestrings.aspx是一個好的開始。有關更多信息,您需要一本書,例如深入操作/ PowerShell中的PowerShell等。 – stej