如何添加多线程?

lar*_*400 7 powershell powershell-2.0 powershell-3.0

有没有办法让下面的内容并行运行(多线程)?我有大约200台需要运行的服务器,并且想知道是否有一种方法可以同时检查10台服务器,而不是一次检查一台...... WMI一次检查这台服务器的速度非常慢.

clear
Write-Host "Script to Check if Server is Alive and Simple WMI Check"

$servers = Get-Content -Path c:\Temp\Servers.txt

foreach($server in $servers)
{
    if (Test-Connection -ComputerName $server -Quiet)
    {
    $wmi = (Get-WmiObject -Class Win32_ComputerSystem -ComputerName $server).Name

    Write-Host "$server responds: WMI reports the name is: $wmi"
    }

    else
    {
    Write-Host "***$server ERROR - Not responding***"
    }
}
Run Code Online (Sandbox Code Playgroud)

jbo*_*kle 10

使用powershell工作:

$scriptblock = {
    Param($server)
    IF (Test-Connection $server -Quiet){
        $wmi = (gwmi win32_computersystem -ComputerName $server).Name
        Write-Host "***$server responds: WMI reports the name is: $wmi"
    } ELSE { Write-Host "***$server ERROR -Not responding***" }
}
$servers | % {Start-Job -Scriptblock $scriptblock -ArgumentList $_ | Out-Null}
Get-Job | Wait-Job | Receive-Job
Run Code Online (Sandbox Code Playgroud)

  • 对于那些不知道命令的人来说,ForEach-Object有别名%和foreach.$ _本质上也就是指这个对象.它的工作方式非常类似于'foreach($ server in $ servers)`,除了在jbockle的代码中,foreach循环只是启动作业(全部为200)并且没有在循环内逐个处理1. (3认同)