循环混淆比较对象

时间:2018-12-04 15:01:32

标签: powershell

我正在尝试创建自己的服务比较脚本。我在网上看到了一些,但我想自己做。我到现在为止。我一直感到困惑。

所需的输出具有以下格式。它甚至不必显示不同之处。我只想查看以前的状态与当前状态相比。我做了一个比较对象,但没有给我想要的格式。然后,我想也许我应该做两个嵌套循环,并用我想要的状态创建一个新对象。它不能正常工作,它返回一个数组。所以我当时想,也许是foreach循环中的for循环...我一直感到困惑,它是如此接近。

您必须为csv提供一些服务进行比较,以使其能够作为其参数的一部分进行工作。

用法

links:
  - dojodb

所需的输出

名称CurrentState PreviousState app1正在停止运行

到目前为止的代码

dojodb

}

2 个答案:

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