尝试使用服务列表显示服务器,并且它们是否正在运行

时间:2017-08-23 19:23:46

标签: powershell

基本上每天我都会收到一份服务器报告,其中包含未运行的服务列表。报告将读作ServerName,Services。我想从csv文件中提取此报告,然后运行脚本以查看为服务器列出的每个服务的状态。

所以,如果我得到像Server1这样的报告,ADobe就不会运行了                            Server1,SQL未运行                            Server2,SQL未运行

我大部分时间都在那里但是,循环在没有列出服务的服务器上运行get-service。我试图找到一种方法在循环的每次迭代后从数组中删除服务但是,我发现很难用powershell做。也可能有更好的方法一起完成这一切。

到目前为止我所拥有的是

$servers = Import-Csv -Path 'C:\Users\zada\Documents\New Text Document.csv' | % {$_.Servername}
$services = Import-Csv -Path 'C:\Users\zada\Documents\New Text Document.csv' | % {$_.Servicename}

foreach ($server in $servers) {
    Write-Host ***************** getting services list for $server *******************
    foreach ($service in $services)   {
        Get-Service -ComputerName $server -Name $services | Format-Table -Property Status, Name, DisplayName -AutoSize

    }

}

问题是它在每个服务器上运行的次数与列出的服务一样多,而且并非所有服务器都具有相同的服务。我玩弄了运行$ service.remove($ services),但是,这并没有把我带到任何地方。

以下是csv文件的外观示例。

Servername  Servicename
server1 SQL Server Agent (SQLEXPRESS)
server1 WSUS
server2 Sophos System Protection Service
server3 WindowsRM

2 个答案:

答案 0 :(得分:0)

乍一看,你已经结束了这一点。

  

问题是它在每个服务器上运行的次数与列出的服务一样多,并且并非所有服务器都具有相同的服务。

这是因为你当然是如何构建循环结构的。让Import-CSV完成它的工作,然后分别迭代每一行。

Import-Csv -Path 'C:\Users\zada\Documents\New Text Document.csv' | Foreach-Object{
    Get-Service -ComputerName $_.ServerName -Name $_.ServiceName 
} | select MachineName, Status, Name, DisplayName

然而,由于您不必要地多次查询同一台服务器,因此效率低下。我们应该做的是将所有服务器组合在一起,然后查询一次。 ......

Import-Csv -Path 'C:\Users\zada\Documents\New Text Document.csv' | Group-Object ServerName | ForEach-Object{
    # The name of the group we are in is the ServerName
    $serverName = $_.Name
    # Create an array of all services we are checking on this host
    $services = $_.Group.ServiceName

    Get-Service -ComputerName $serverName -Name $services
} | select MachineName, Status, Name, DisplayName

因此,我们将具有相同服务器名称的所有行分组,并在一次cmdlet调用中查询与该服务器关联的CSV中的所有服务。

答案 1 :(得分:-1)

以下是您不需要事先了解服务的示例:

$Services = Get-Service -ComputerName $Servers |
              Where-Object { $_.Name -eq 'stopped' } |
              ForEach-Object { <# ... #> }

但是这会将所有已停止的服务放入一个数组中,而不是特定于它们停在哪个服务器上。如果没有示例数据集,我并不完全确定你想要完成的任务。

根据反馈进行更新:

$CSV = Import-Csv -Path 'C:\Users\zada\Documents\New Text Document.csv'

[HashTable]$Services = @{}

For ($i = 0; $i -lt $CSV.Count; $i++)
{
    $Services[$CSV[$i].Servers] += ,$CSV[$i].ServiceName
}

这将生成您的哈希表,以便您可以执行所需的操作:

ForEach ($Server in $Services.Keys) {
    Write-Host "Getting services for $Server"
    Get-Service -ComputerName $Server -Include $Services.$Server |
      Format-Table -Property Status,Name,DisplayName -Autosize
}