我正在尝试创建自己的服务比较脚本。我在网上看到了一些,但我想自己做。我到现在为止。我一直感到困惑。
所需的输出具有以下格式。它甚至不必显示不同之处。我只想查看以前的状态与当前状态相比。我做了一个比较对象,但没有给我想要的格式。然后,我想也许我应该做两个嵌套循环,并用我想要的状态创建一个新对象。它不能正常工作,它返回一个数组。所以我当时想,也许是foreach循环中的for循环...我一直感到困惑,它是如此接近。
您必须为csv提供一些服务进行比较,以使其能够作为其参数的一部分进行工作。
用法
links:
- dojodb
所需的输出
名称CurrentState PreviousState app1正在停止运行
到目前为止的代码
dojodb
}
答案 0 :(得分:0)
此答案是假设没有定期添加新服务。
您几乎明白了!您可以放弃嵌套循环,摆脱else块(这是多余的),并使用索引循环。当使用这样的嵌套循环时,每次遍历(get-service)对象之一时,就遍历$ old数组中的所有数组元素。当您的数组包含数千个对象时,这可能会导致问题。
通过使用for循环,您可以轻松地找到所需的内容。
例如
if($TimeToWait -ne $null) {
Start-Sleep -Seconds $TimeToWait
}
$list = @();
$old = Import-Csv -Path $SnapshotPath | Sort-Object Name;
$new = Get-Service | Sort-Object Name;
for ($i -eq 0; $i -lt $old.length -or $i -lt $new.length; $i++) {
$object = New-Object -TypeName psobject -Property @{
Name = $new[$i].Name
CurrentStatus = $new[$i].status
DisplayName = $new[$i].displayname
PreviousStatus = $old[$i].status
}
$list += $object;
}
$list;
您的许多代码都是多余的,您可以一次性完成所有操作。由于从技术上讲,您不是在比较任何对象,因此您可以随便填充字段。
答案 1 :(得分:0)
之所以这样做,是因为它实际上是在检查旧服务的值是否与Get-Service
在特定时间提供的服务相同。
function Inspect-ServiceSnapshot {
[CmdletBinding()]
param (
#Snapshot
[Parameter(Mandatory=$true)]
[ValidateScript({Test-Path $_ -PathType Leaf})]
[string]$SnapshotPath,
# timer
[Parameter(Mandatory=$false)]
[int]$TimeToWait = 0
)
if($TimeToWait) { Start-Sleep -Seconds $TimeToWait }
$list = @()
$old = Import-Csv -Path $SnapshotPath
foreach($entry in (Get-Service)) {
# make sure we are dealing with the SAME service
$oldItem = $old | Where-Object { $_.Name -eq $entry.Name }
$object = New-Object -TypeName psobject -Property @{
Name = $entry.Name
CurrentStatus = $entry.status
DisplayName = $entry.displayname
PreviousStatus = if ($oldItem) { $oldItem.status } else { 'Unknown' }
}
$list += $object
}
$list
}