У меня есть процесс, который получает список серверов из таблицы базы данных SQL. Оттуда этот список проходит цикл и выполняет тест ping. Сервер и результат теста ping отправляются обратно в ту же таблицу базы данных SQL, но обновляет столбец «IS_PINGABLE» результатом.
Следующий скрипт Powershell делает это, но очень медленно. Я взял часть кода отсюда: https://gallery.technet.microsoft.com/scriptcenter/Powershell-Script-to-ping-15e0610a и добавил некоторые другие шаги.
Если у кого-нибудь есть предложение сделать это быстрее, лучше, сильнее, пожалуйста, дайте мне знать ниже. Большое спасибо заранее.
$MasterServerConnString = dbserver,1433
#**********************************************************************
#region Get Server List
#Get Server list from SQL DB Table and save to temp Powershell table
#**********************************************************************
$ping_cmd = "Set NOCOUNT ON; SELECT distinct machinename, IS_PINGABLE FROM [DB].[dbo].[TABLE] order by 1"
$ping_cn = new-object System.Data.SqlClient.SqlConnection("Data Source=$MasterServerConnString;Integrated Security=SSPI;Initial Catalog=DB");
$ping_cn.Open()
$ping_a = $ping_cn.CreateCommand()
$ping_a.CommandText = $ping_cmd
$ping_a = $ping_a.ExecuteReader()
$ping = new-object “System.Data.DataTable” "computername"
$ping.Load($ping_a)
$ping_cn.Close()
$Server = $ping.Item(0)
#**********************************************************************
#endregion
#**********************************************************************
#region Ping Sever Test
#Ping each server to see if there is connectivity. If pingable, 1. If not pingable 0.
#**********************************************************************
$PCData = foreach ($PC in $Server) {
Write-Verbose "Checking computer'$PC'"
try {
Test-Connection -ComputerName $PC -Count 2 -ErrorAction Stop | Out-Null
$Props = @{
ComputerName = $PC
Status = 1
}
New-Object -TypeName PSObject -Property $Props
} catch { # either ping failed or access denied
try {
Test-Connection -ComputerName $PC -Count 2 -ErrorAction Stop | Out-Null
$Props = @{
ComputerName = $PC
Status = 0
}
New-Object -TypeName PSObject -Property $Props
} catch {
$Props = @{
ComputerName = $PC
Status = 0
}
New-Object -TypeName PSObject -Property $Props
}
}
}
#**********************************************************************
#endregion
#**********************************************************************
#region Upload Results
#Upload the ping results for each server back to the database table
#**********************************************************************
foreach ($sv in $PCData)
{
$svr_name = $sv.ComputerName
$svr_stat = $sv.Status
$Updatequery = "
Update [DB].[dbo].[TABLE]
SET
IS_PINGABLE = $svr_stat
WHERE
MachineName = '$svr_name'
"
$A_cn = new-object System.Data.SqlClient.SqlConnection("Data Source=$MasterServerConnString;Integrated Security=SSPI;Initial Catalog=DB");
$A_cn.Open()
$command = $A_cn.CreateCommand()
$command.CommandText = $Updatequery
$result = $command.ExecuteReader()
$A_cn.Close()
}
#**********************************************************************
#endregion