PowerShell 调用命令速度 (win32_product)

PowerShell Invoke-Command Speed (win32_product)

我写了一个简短的脚本来卸载多台计算机上的程序(来自主机名的文本文档)。该脚本按预期工作,但每个主机大约需要 2-3 分钟。有没有办法同时在所有机器上执行此操作?

这是我的脚本。

$computers = Get-Content C:\Computernames.txt
foreach($Computer in $computers){
    Invoke-Command -ComputerName $Computer -ScriptBlock{
    
    $application = Get-WmiObject -Class Win32_Product -Filter "Name LIKE '%Appname%'"

    #uninstall the app if it exists
    if($application){
        $application.Uninstall()
        Write-Output "Application uninstalled successfully.."
    }

    else{
        Write-Output "Application not found.."
    }
    } 
}

我可以做 Invoke-Command -ComputerName $Computers 并同时做所有机器以避免循环吗?

按照建议,使用 $Computers 成功。我能够摆脱我的循环并极大地加快脚本速度。

这是更新后的脚本 - 感谢您告诉我它支持数组。

#list of computers
$computers = Get-Content C:\Computernames.txt


Invoke-Command -ComputerName $computers -ScriptBlock{
    

$application = Get-WmiObject -Class Win32_Product -Filter "Name LIKE '%appname%'"


if($application){
    $application.Uninstall()
    Write-Output "Successful uninstall on $env:COMPUTERNAME "
    }

else{
    Write-Output "Application not found on $env:COMPUTERNAME"
    }
}

win32_product class 是出了名的慢,因为它会在使用时验证每个 msi。我假设 appname 被替换为特定名称。您可以在 powershell 5.1 中使用鲜为人知的 get-package 和 uninstall-package,但仅限于 msi 提供程序:

get-package appname | uninstall-package