我正在查询大约280台XenApp服务器。这是我的疑问。
$bootupMemory = gwmi -Query "SELECT * FROM Win32_OperatingSystem" -ComputerName $srv
#$cpuLoad = gwmi -Query "SELECT * FROM Win32_Processor" -ComputerName $srv
#$tSessions = gwmi -Query "SELECT * FROM Win32_TerminalService" -ComputerName $srv
$ima = gwmi -Query "SELECT * FROM Win32_Service WHERE name='imaservice'" -ComputerName $srv
$mfcom = gwmi -Query "SELECT * FROM Win32_Service WHERE name='mfcom'" -ComputerName $srv
$ctxPrintMgr = gwmi -Query "SELECT * FROM Win32_Service WHERE name='cpsvc'" -ComputerName $srv
$msmqstatus = gwmi -Query "SELECT * FROM Win32_Service WHERE name='msmq'" -ComputerName $srv
$cDrive = gwmi -Query "SELECT * FROM Win32_Logicaldisk WHERE deviceid='c:'" -ComputerName $srv
$dDrive = gwmi -Query "SELECT * FROM Win32_Logicaldisk WHERE deviceid='d:'" -ComputerName $srv
$loginStatus = gwmi -Query "SELECT loginsenabled, numberofsessions FROM Metaframe_Server" -Namespace root\citrix -ComputerName $srv
$load = gwmi -Query "SELECT * FROM Metaframe_Server_loadlevel" -Namespace root\citrix -ComputerName $srv
您能否建议这是最佳还是我可以优化它。 另外,如何在每个查询中加入超时参数。这可能吗?
答案 0 :(得分:5)
针对同一主机对同一个类运行多个查询肯定不是最佳选择。您可以通过合并同一类的查询的WHERE
子句来在一定程度上优化代码:
SELECT * FROM Win32_Service WHERE name='imaservice' OR name='mfcom' OR name='cpsvc' OR name='msmq'
但是,由于您仍需要查询几个不同的类,我建议在远程主机上运行整个代码并将结果作为自定义对象返回:
$result = Invoke-Command -ComputerName $srv -ScriptBlock {
New-Object -Type PSObject -Property @{
computername = $env:COMPUTERNAME
bootupMemory = gwmi -Query "SELECT * FROM Win32_OperatingSystem"
#cpuLoad = gwmi -Query "SELECT * FROM Win32_Processor"
#tSessions = gwmi -Query "SELECT * FROM Win32_TerminalService"
ima = gwmi -Query "SELECT * FROM Win32_Service WHERE name='imaservice'"
mfcom = gwmi -Query "SELECT * FROM Win32_Service WHERE name='mfcom'"
ctxPrintMgr = gwmi -Query "SELECT * FROM Win32_Service WHERE name='cpsvc'"
msmqstatus = gwmi -Query "SELECT * FROM Win32_Service WHERE name='msmq'"
cDrive = gwmi -Query "SELECT * FROM Win32_Logicaldisk WHERE deviceid='c:'"
dDrive = gwmi -Query "SELECT * FROM Win32_Logicaldisk WHERE deviceid='d:'"
loginStatus = gwmi -Query "SELECT loginsenabled, numberofsessions FROM Metaframe_Server" -Namespace root\citrix
load = gwmi -Query "SELECT * FROM Metaframe_Server_loadlevel" -Namespace root\citrix
}
}
在单独的job中为每个服务器运行Invoke-Command
以并行运行查询,从而缩短整体处理时间。
Start-Job -ScriptBlock {
Invoke-Command -ComputerName $args[0] -ScriptBlock {
New-Object ...
}
} -ArgumentList $srv
Get-Job | Wait-Job | Receive-Job
或(正如Mathias在评论中所建议的那样)
Invoke-Command -ComputerName $srv -AsJob -ScriptBlock {
New-Object ...
}
Get-Job | Wait-Job | Receive-Job