0

我正在查询大约 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

你能否建议这是否是最佳的,或者我可以优化它。还如何将超时参数与每个查询结合起来。这可能吗?

4

1 回答 1

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
  }
}

Invoke-Command在单独的作业中为每个服务器运行以并行运行查询,从而减少整体处理时间。

Start-Job -ScriptBlock {
  Invoke-Command -ComputerName $args[0] -ScriptBlock {
    New-Object ...
  }
} -ArgumentList $srv

Get-Job | Wait-Job | Receive-Job

或(正如马蒂亚斯在评论中建议的那样)

Invoke-Command -ComputerName $srv -AsJob -ScriptBlock {
  New-Object ...
}

Get-Job | Wait-Job | Receive-Job
于 2016-08-18T14:22:58.430 回答