Нужно добавить вывод функции в массив, с которым она работает - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь написать скрипт powershell, который извлекает некоторые данные из NetBackup.Одной из точек данных является дата начала резервного копирования, но NetBackup выводит ее в формате Unix (я полагаю, что это число секунд с 01.01.1970).

У меня работает раздел извлечения.Я могу преобразовать строку даты в пригодный для использования формат, используя функцию, которую я нашел в Интернете.Я борюсь с тем, чтобы вернуть исправленную дату обратно в исходный массив.

Итак, $ BackupResults - это извлечение из NetBackup:

Пример

Статус запуска Jobid
----- ------- ------
330447 1562743826 0
330446 1562743557 191
330445 1562743556 191

Я тогда объявилпреобразовать функцию и запустить цикл foreach для результатов, поместив результаты в $ CorrectedDates.Чего я не могу понять, так это как добавить это обратно в исходный массив - либо путем объединения массивов, либо просто записав результат прямо в массив $ BackupResults.

$CorrectedDates = New-Object System.Collections.ArrayList
$BackupResults = Get-NetBackupJob -Full | Select-Object jobid,started,status

Function Convert-FromUnixDate ($UnixDate) {
   [timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').AddSeconds($UnixDate))
}


Foreach ($BackupResult in $BackupResults)
{
$OutDate = Convert-FromUnixDate $BackupResult.started
[void]$CorrectedDates.add($OutDate)
}

$BackupResults = New-Object psobject
$BackupResults | add-member -name Date -type noteproperty -Value $CorrectedDates

Версия вышеработает без ошибок, но $ BackupResults заканчивается строкой с исправленными датами, а не с исправленными датами, добавленными к каждой строке в исходных данных:

{10/07/2019 08:45:57, 10/07/2019 08:45:57, 10/07/2019 08:45:57, 10/07/2019 08:30:26...}

Что мне нужно, так это исходный $ BackupResults изно с дополнительным столбцом с каждой датой Unix, преобразованной в человеческую дату (не важно, как называется выходной массив).Затем он будет использоваться для настройки какого-либо мониторинга.

РЕДАКТИРОВАТЬ:

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

Я сейчас пытаюсь отфильтровать результаты перед выводом.В частности, я хочу получить результаты только в том случае, если отметка даты находится в течение последних 24 часов, а возвращенный код состояния равен 2. Я предполагаю, что мне нужно использовать .AddDays (-1) где-то в строке 18 л, но я не могу найтиместо, где это действительно?И как мне отфильтровать вывод строки состояния?

1 Ответ

0 голосов
/ 10 июля 2019

Вы можете сделать это за один раз, используя вычисленное выражение:

function ConvertFrom-UnixTimeStamp([Int64]$unixTimeStamp, [switch]$asUtc) {
    if ($unixTimeStamp -gt 253402430399) {
        Write-Error "Cannot convert $unixTimeStamp to DateTime. Only integer values up to 253402430399 are valid."
    }
    elseif ($unixTimeStamp -gt [Int32]::MaxValue) {
        Write-Warning "The given value exceeds the [Int32]::MaxValue and therefore enters the Year2038 Unix bug.."
    }
    # a Unix timestamp is in UTC
    [DateTime]$origin = New-Object System.DateTime 1970, 1, 1, 0, 0, 0, 0, Utc

    if ($asUtc) { return $origin.AddSeconds($unixTimeStamp) }
    return ($origin.AddSeconds($unixTimeStamp)).ToLocalTime()
}


$BackupResults = Get-NetBackupJob -Full | 
                    Select-Object jobid,
                                  @{Name = 'started'; Expression = {ConvertFrom-UnixTimeStamp $_.started}},
                                  status

Я изменил ваш код для перевода метки времени unix в объект datetime, поэтому данная метка времени обрабатывается как UTC, как и должно быть.

Результат:

 jobid started            status
 ----- -------            ------
330447 10-7-2019 09:30:26      0
330446 10-7-2019 09:25:57    191
330445 10-7-2019 09:25:56    191

Обратите внимание, я запускаю это на голландском компьютере, поэтому формат даты в вашем случае может быть другим.

Надеюсь, это поможет

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