我正在创建一个脚本,该脚本将监视在一个或多个服务器上运行的一个或多个服务的状态,并在其中一个服务器停止时发送电子邮件警报。管理员将修改单个TSV文本文件,添加其服务器名称,并在该服务器上添加一个或多个要用逗号分隔的服务。
TSV输入文件:
Hostname Services
S-UTILITY Actserv,AdobeARMservice
S-SCCM RServer3,AdobeARMservice,VaultSvc
代码:
Import-Csv C:\temp\services.txt -Delimiter "`t" | ForEach {
$Service = $_.Services -split ','
Get-Service -ComputerName $_.Hostname -Name $Service | Select-Object | ft $_.Hostname, DisplayName,status -AutoSize
}
这导致:
S-UTILITY DisplayName Status
--------- ----------- ------
Radmin Activation Server V1 Running
Adobe Acrobat Update Service Running
S-SCCM DisplayName Status
------ ----------- ------
Adobe Acrobat Update Service Running
Radmin Server V3 Running
Credential Manager Stopped
到目前为止这很好。但是,我不知道该怎么做是希望能够在变量中单独处理为给定服务器列出的每个服务。就像现在一样,在ForEach循环中,$ Service的值返回服务器的所有输入服务:
PS C:\Windows\System32\WindowsPowerShell\v1.0> $Service
RServer3
AdobeARMservice
VaultSvc
......而不是一次只有一个:
RServer3
换句话说,我想通过Get-Service命令单独运行每个列出的服务,因为稍后我将使用该变量来报告特定服务器上的特定服务。
答案 0 :(得分:1)
只管道到另一个ForEach-Object
。如果需要保留以前的管道对象,请将其保存到变量:
Import-Csv C:\temp\services.txt -Delimiter "`t" | ForEach-Object {
$Hostname = $_.Hostname;
$Services = $_.Services -split ',';
$Services | ForEach-Object {
$Service = $_;
Get-Service -ComputerName $Hostname -Name $Service | Select-Object | ft $Hostname, DisplayName,status -AutoSize;
}
}
请注意,您的输出格式对我来说很奇怪,因为您创建了一个不包含任何内容的$Hostname
标题,但如果您想要的话,那么这就是您所希望的内容。'很好。此外Select-Object
这里实际上什么都不做。你可以完全删除它,你就可以了。
答案 1 :(得分:0)
进一步调整之后,我发现这是我使用的最终代码,允许我为服务器和每个服务名称分配一个变量:
Import-Csv C:\temp\servicecheck\services.txt -Delimiter "`t" | ForEach-Object {
Get-Service -ComputerName $_.Hostname -Name ($_.Services -split ',')
} | Where-Object { $_.Status -eq "Stopped" } | ForEach-Object {
$Server = $_.MachineName
$DisplayName = $_.DisplayName
}