2012-06-12 65 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