我正在尝试整理一个简单的脚本,该脚本将检查非常大的服务器列表的状态。在这种情况下,我们将其称为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
答案 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 = @()
,将其填入您的列表并将其传递给该函数。