PowerShell批量测试连接

时间:2015-05-06 05:59:53

标签: powershell

我正在尝试整理一个简单的脚本,该脚本将检查非常大的服务器列表的状态。在这种情况下,我们将其称为servers.txt。我知道使用Test-Connection,你可以在-count开关上指定的最短时间是1.我的问题是如果你最终在脚本中有1000台机器,你可以期望在返回结果时延迟1000秒。我的问题:有没有办法以快速的方式测试非常大的机器列表以防止测试连接,而不是等待每个机器一次失败?

当前代码:

Get-Content -path C:\Utilities\servers.txt | foreach-object {new-object psobject -property @{ComputerName=$_; Reachable=(test-connection -computername $_ -quiet -count 1)} } | ft -AutoSize 

2 个答案:

答案 0 :(得分:4)

Test-Connection有一个-AsJob开关可以满足你的需要。为了达到同样的目的,你可以尝试:

Get-Content -path C:\Utilities\servers.txt | ForEach-Object { Test-Connection -ComputerName $_ -Count 1 -AsJob } | Get-Job | Receive-Job -Wait | Select-Object @{Name='ComputerName';Expression={$_.Address}},@{Name='Reachable';Expression={if ($_.StatusCode -eq 0) { $true } else { $false }}} | ft -AutoSize

希望有所帮助!

答案 1 :(得分:2)

我一直在使用工作流程。使用衍生到许多子进程的作业可以使用(对我而言)

workflow Test-WFConnection {
  param(
    [string[]]$computers
  )
    foreach -parallel ($computer in $computers) {        
        Test-Connection -ComputerName $computer -Count 1 -ErrorAction SilentlyContinue
  }
}

用作

Test-WFConnection -Computers "ip1", "ip2"

或者,声明[string[]]$computers = @(),将其填入您的列表并将其传递给该函数。