使用Powershell调用表达式在所有域计算机上卸载Java

使用Powershell调用表达式在所有域计算机上卸载Java,java,powershell,invoke-command,Java,Powershell,Invoke Command,我可以将ps会话连接到远程计算机,运行以下操作,并成功卸载Java: 调用表达式“msiexec/q/x'{26A24AE4-039D-4CA4-87B4-2F83218025F0}'” 我正在尝试创建一个脚本,该脚本将从所有域计算机卸载: Import-Module ActiveDirectory function uninstallJava { $badcomp = @() $CompList = Get-ADComputer -Filter 'name -like "*"' | selec

我可以将ps会话连接到远程计算机,运行以下操作,并成功卸载Java:
调用表达式“msiexec/q/x'{26A24AE4-039D-4CA4-87B4-2F83218025F0}'”

我正在尝试创建一个脚本,该脚本将从所有域计算机卸载:

Import-Module ActiveDirectory
function uninstallJava {
$badcomp = @()
$CompList = Get-ADComputer -Filter 'name -like "*"' | select -ExpandProperty Name
foreach ($c in $CompList) {

Try {
Enter-PSSession -ComputerName $computer 
Invoke-expression "msiexec.exe /q /x '{26A24AE4-039D-4CA4-87B4-2F83218025F0}' "
}

Catch {
$badcomp += $c
}

}

}
uninstallJava
"the following servers could not be reached:"
$badcomp
我没有收到任何错误,但它没有从远程机器卸载Java


任何想法都值得赞赏。

您应该使用
调用命令
,而不是
输入PSSession
。后者用于在另一台机器上交互工作。前者用于在另一台机器上运行命令并返回结果(如果有)

Import-Module ActiveDirectory
$badcomp = @()

Function uninstallJava {
    $CompList = Get-ADComputer -Filter 'name -like "*"' | Select -ExpandProperty Name
    ForEach ($c In $CompList) {
        Try {
            Invoke-Command -ComputerName $c {
                C:\Windows\System32\cmd.exe /C msiexec.exe /q /x '{26A24AE4-039D-4CA4-87B4-2F83218025F0}'
            }
        } Catch {
            $badcomp += $c
        }
    }
}
uninstallJava

Write-Host "the following servers could not be reached:"
$badcomp
基本上,您的try块应该如下所示:

试试看{
调用命令-ComputerName$c-ScriptBlock{msiexec.exe/q/x'{26A24AE4-039D-4CA4-87B4-2F83218025F0}}
}

如果您想得到更详细的控制和错误信息,请考虑不要去掉<代码> MsiExcel 。< /P>对函数的调用在函数的Script块内。所以它不仅不会启动,而且如果它启动了,你将有一个无限循环。谢谢弗罗德,我的错误。我修复了这个问题,它调用了函数,但不起作用。您是否考虑过使用WMI/CIM调用卸载该程序?如果它是MSIExec友好的,您应该能够做到这一点。谢谢你,布莱恩斯特。我尝试用您建议的方法替换Try块,但没有效果。我还尝试运行Invoke命令

Invoke命令-ComputerName testcomp-ScriptBlock{msiexec.exe/q/x'{26A24AE4-039D-4CA4-87B4-2F83218025F0}}
,但它也不起作用。如上所述,invoke expression可以工作…似乎invoke命令也应该工作…我不能确定为什么
msiexec
调用不能工作。您可以检查返回代码或某种状态,然后将其返回给调用代码。你可以在scriptblock中进行这些检查。嗯,这有点超出我的理解范围,但我会看看我能找到什么。我错过了之前WMI卸载的链接。谢谢你。顺便说一句,它与内森的建议非常相似。再次谢谢,谢谢你,内森。我按原样尝试了你的解决方案,但没有成功。如果我只是在一台机器上输入PSSession并运行
msiexec.exe/q/x'{26A24AE4-039D-4CA4-87B4-2F83218025F0}'
,这就行了。如果我运行整个函数,只需将*替换为一个“testcomp”就可以对一台机器进行测试,但这个“testcomp”也不起作用。实际上,我没有测试远程执行,我假设您已经测试过,只需要脚本的语法帮助。我更新了调用Invoke命令的代码。现在试一试。我刚测试过,效果不错!这与我尝试的其他解决方案类似。我猜去掉scriptblock参数并用/C选项指定路径反而起到了作用。谢谢你的帮助,内森。我会投票,但我还没有达到要求的声誉。很高兴听到这个消息。如果您愿意,您可以接受答案。:)