Loop Confusion Сравнение объектов - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь создать свой собственный скрипт сравнения сервисов.Я вижу некоторые онлайн, но хочу сделать это сам.Я только получил до сих пор.Я все время путаюсь.

Требуемый вывод в следующем формате.Это даже не должно показать, что отличается.Я просто хочу увидеть, что предыдущее состояние сравнивалось с текущим состоянием.Я сделал объект сравнения, и он не дал мне желаемый формат.Затем я подумал, что, может быть, мне следует просто сделать два вложенных цикла и создать новый объект с нужными ему состояниями.Это не сработало правильно, он возвращает массив.Тогда я подумал, может быть, цикл for в цикле foreach ... Я запутываюсь, и это так близко.

Вы должны предоставить csv некоторые службы для сравнения, чтобы сделать эту работу частью своих параметров.

Использование

Inspect-ServiceSnapshot -SnapshotPath "C:\YourPath"

Желаемый выход

Имя CurrentState ПредыдущееСостояние приложения1 Выполняется Остановлено

Код пока что

function Inspect-ServiceSnapshot {
[CmdletBinding()]
param (
    #Snapshot
    [Parameter(Mandatory=$true)]
    [ValidatePattern("C:")]
    [string]
    $SnapshotPath,

    # timer
    [Parameter(Mandatory=$false)]
    [int]
    $TimeToWait
)

   if($TimeToWait -ne $null) {
    Start-Sleep -Seconds $TimeToWait
    $list = @()
    $old = Import-Csv -Path $SnapshotPath
    foreach($entry in (get-service)) {
        foreach($oldItem in $old) {
            $object = New-Object -TypeName psobject -Property @{
                Name = $entry.Name
                CurrentStatus = $entry.status
                DisplayName = $entry.displayname
                PreviousStatus = $oldItem.status
        }
        $list += $object
        }
    }
    $list

} else {
    $list = @()
    $old = Import-Csv -Path $SnapshotPath
    foreach($entry in (get-service)) {
        foreach($oldItem in $old) {
            $object = New-Object -TypeName psobject -Property @{
                Name = $entry.Name
                CurrentStatus = $entry.status
                DisplayName = $entry.displayname
                PreviousStatus = $oldItem.status
        }
        $list += $object
        }
    }
    $list
}

}

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Это следует сделать, потому что на самом деле проверяется, чтобы значение для старой службы совпадало с тем, которое 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
}
0 голосов
/ 04 декабря 2018

В этом ответе предполагается, что новые службы не добавляются на регулярной основе.

Вы почти получили его!Вы можете отказаться от вложенных циклов, избавиться от блока else (он избыточен) и использовать индексный цикл.Когда вы используете подобные вложенные циклы, вы перебираете все элементы массива в массиве $ old каждый раз, когда перебираете один из объектов (get-service).Это может вызвать проблемы, когда ваши массивы содержат тысячи объектов.

Вы можете легко получить то, что хотите, используя цикл 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;

Многовашего кода является избыточным, и вы можете просто сделать все это за один раз.Поскольку технически вы не сравниваете какие-либо объекты, вы можете просто заполнять поля по мере их поступления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...