PowerShell大规模测试连接

djs*_*akz 4 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 
Run Code Online (Sandbox Code Playgroud)

Lie*_*ers 6

我一直在为此使用工作流程。使用生成许多子进程的作业(对我来说)可用。

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

用作

Test-WFConnection -Computers "ip1", "ip2"
Run Code Online (Sandbox Code Playgroud)

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


And*_*ist 5

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

希望有帮助!