gpt4 book ai didi

powershell - 如果服务正在运行,则保存到文件;如果未保存,则保存到另一个文件

转载 作者:行者123 更新时间:2023-12-03 01:29:52 27 4
gpt4 key购买 nike

我正在尝试创建脚本,如果服务正在运行,它将把计算机名称和服务保存到Running.txt文件,否则计算机名称和服务将保存到NotRunning.txt

$comp = get-content -path "AllComps"

if(Get-Service -DisplayName "av*", "pri*" -ComputerName $comp | Where { $_.Status -eq 'stopped'}) {
$_ | Sort-Object MachineName | Format-Table -Property MachineName, Status, Name, DisplayName |
Out-File -FilePath 'NotRunning.txt'
} else {
$_ | Sort-Object MachineName | Format-Table -Property MachineName, Status, Name, DisplayName |
Out-File -FilePath 'Running.txt'
}


我所有的输入最终保存到NotRunning.txt文件。

我是Powershell的新手,所以我们将不胜感激。

最佳答案

考虑一下if语句的条件...

Get-Service -DisplayName "av*", "pri*" -ComputerName $comp | Where { $_.Status -eq 'stopped'}

如果该管道仅产生一个服务对象,则整个过程将评估为 $true。例如,假设给定计算机上有两个与您的过滤器匹配的服务,一个是 Stopped,另一个是 Running ...
MachineName DisplayName Status
=========== =========== ======
Machine1 AV1 Running
Machine1 Pri2 Stopped

...因为至少有一项服务是 Stopped,所以 if语句最终只会写入 NotRunning.txt。或者,说这两个服务存在于三台计算机上,除了其中一个实例之外的所有实例都是 Running ...
MachineName DisplayName Status
=========== =========== ======
Machine1 AV1 Running
Machine1 Pri2 Stopped
Machine2 AV1 Running
Machine2 Pri2 Running
Machine3 AV1 Running
Machine3 Pri2 Running

...将发生同样的事情,五个 Running服务将被 Stopped一个服务掩盖。

为了解决这个问题,我将使用 ForEach-Object遍历服务对象的结果集,并在其中使用 if语句检查 Status并写入适当的文件...

Get-Service -DisplayName "av*", "pri*" -ComputerName $comp `
| Sort-Object MachineName
| ForEach-Object -Process {
$outputFileName = if ($_.Status -eq 'Stopped') {
'NotRunning.txt'
} else {
'Running.txt'
}

# Just write the service information as simple CSV output
$_.MachineName, $_.Name, $_.DisplayName -join ',' `
| Out-File -FilePath $outputFileName -Append
}

请注意,我更改了文件输出的生成方式。这是因为现在每个服务实例调用 Out-File一次,而不是每个文件调用一次,因此,如果我使用 Format-Table(或者说 Export-Csv ),我将为每个服务最终得到一个完整的表(包括一个新的 header 和全部)行; -Append是必需的,因此我们不会得到仅包含最后一个服务实例的文件。

为了使我们能够使用带有标题的基于记录的输出,我们可以使用 Group-Object cmdlet来根据 Status是否为 Running来分组收集服务...

Get-Service -DisplayName "av*", "pri*" -ComputerName $comp `
| Group-Object -Property @{ Expression = { $_.Status -eq 'Running' } } `
| ForEach-Object -Process {
# $_.Name contains the result of $_.Status -eq 'Running' above
$outputFileName = if ($_.Name -eq $true) {
'Running.txt'
} else {
'NotRunning.txt'
}

# $_.Group contains all of the service instances with
# the same 'Running'/not 'Running' value for Status
$_.Group `
| Sort-Object MachineName `
| Format-Table -Property MachineName, Status, Name, DisplayName `
| Out-File -FilePath $outputFileName
}

因此,传递给 ScriptBlock{ }( ForEach-Object)最多将运行两次:一次针对 StatusRunning的服务,一次针对 Statusany other value的服务。

关于powershell - 如果服务正在运行,则保存到文件;如果未保存,则保存到另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59295813/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com