sql - Powershell – 使用 SQL 数据 Ping 服务器进程
问题描述
我有一个从 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
解决方案
推荐阅读
- python-3.x - 如何在文本小部件中制作一个输出整数的按钮
- c# - C# - 等待进程退出并关闭“ShowDialog()”
- node.js - 如何在 node js 中将 app.post 和 app.get 合二为一
- sql-server - 我如何从列现有值的表中获取数据
- mongodb - 如何将相同的文档存储在多个集合中
- pyautogui - 使用 pyautogui 时应用程序如何获得鼠标移动
- php - laravel 基于 API 响应调用的自定义认证
- ms-word - 是否有 dart 包来解码 ms word 文档并在颤振应用程序中进行编辑?
- mysql - 在 Codeigniter 中使用查询生成器 - 如何正确别名?
- google-cloud-platform - 使用 Google Cloud Datastore GQL 编辑器时,我可以在 GQL 中使用注释吗?