PowerShell - был ли файл создан для каждого часа? - PullRequest
2 голосов
/ 29 апреля 2020

Я пытаюсь создать сценарий PowerShell, который будет запускаться один раз каждое утро (через планировщик задач) и предупреждать кого-либо (через прямую отправку (я знаю, как это сделать, и я реализую указанную функцию позже)), если файл не был ' Создается в течение каждого часа предыдущего дня, чтобы вам больше не приходилось делать это вручную или когда возникает проблема. Имена файлов, как показано в $ FilePattern, содержат дату их создания и время. Очевидно, логика c в моем Foreach l oop имеет недостатки, потому что $ Time всегда будет в $ Hours, но я почесал голову и не смог понять, как мне следует go об этом. Я думал, что смогу сравнить два массива, но сейчас я не уверен. Я также натолкнулся на Compare-Object, который казался многообещающим, но я не мог это сделать. Мои извинения за беспорядок. Мой текущий код выглядит следующим образом.

[CmdletBinding()]

param(

    [Parameter(Mandatory=$false)]
    [ValidateScript({ Test-Path $_ -PathType Container })]
    [string]
    $Path = "C:\Users\<username>\Desktop\Archive",
    $Year = [DateTime]::Today.AddDays(-1).Year,
    $Month = [DateTime]::Today.AddDays(-1).Month,
    $Day = ([DateTime]::Today.AddDays(-1).Day),
    $strMonth = ([String]$Month).PadLeft(2,'0'),
    $strDay = ([String]$Day).PadLeft(2,'0'),
    $Date = "$Year" + "$strMonth" + "$strDay",
    $FilePattern = @("850_" + $Date + "*.txt"),
    $Files = (Get-ChildItem -Path $Path -Include $FilePattern -Recurse | 
        Select-Object -ExpandProperty CreationTime | Get-Date -f "yyyyMMdd"),
    $Time = (Get-ChildItem -Path $Path -Include $FilePattern -Recurse |
        Select-Object -ExpandProperty CreationTime | Get-Date -f "hh"),
    $Hours = @(0..23)

)

Foreach ($File in $Files) {

    #if (-Not (Test-Path "$Path\$FilePattern")) {
    #    Write-Host "Warning: The file path doesn't exist!"
    #} else {
    #    Write-Host "The file path exists..."
    #}

    if ($Hours -notin $Time) {
        Write-Host "There's no file present for $Time o'clock for $Date."
    } else {
        Write-Host "There's at least one file per hour for $Date."
    }

}

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Вот более короткая и, вероятно, более читаемая реализация:

$Path = "C:\Users\<username>\Desktop\Archive\*"
$Date = (Get-Date).AddDays(-1).ToString('yyyyMMdd')
$Hours = Get-ChildItem -Path $Path -Include "850_$($Date)*.txt" | ForEach-Object {(Get-Date $_.CreationTime).Hour} | Sort-Object | Get-Unique
for ($Hour = 0; $Hour -lt 24; $Hour++) {
    if ($Hour -in $Hours) {
        Write-Host "There's at least one file for $Hour o'clock for $Date." -ForegroundColor Green
    } else {
        Write-Host "There's no file present for $Hour o'clock for $Date." -ForegroundColor Red
    }
}

Итак, что я изменил:

  • Я удалил блок params, как я думаю, вы только что использовали он инициализирует переменные, но он предназначен для определения параметров, которые вы хотите передать функции. Не похоже, что вы хотите что-то передать этому сценарию. Поправьте меня, если я ошибаюсь.
  • Я добавил звездочку (*) к вашему пути, чтобы заставить работать параметр -Include (см. docs ). Я думаю, что вы добавили -Recurse, чтобы заставить его работать. Используйте -Recurse только в том случае, если ваши журналы расположены в подкаталогах.
  • Я добавил способ более удобочитаемый и понятный для создания желаемой отметки времени.
  • Я извлек часы, которые вы ищете для чисел, так что вы можете сравнить их с числами, и вам не нужно создавать массив из двухзначных строк с часами.
  • Я добавил цвета в вывод, чтобы получить более быстрый обзор, если какой-либо файл отсутствует.
1 голос
/ 01 мая 2020

Мне все еще нужно провести рефакторинг и изменить несколько вещей, но, похоже, это работает.

[CmdletBinding()]

param(

    $Path = "C:\Users\<username>\Desktop\Archive",
    $Year = [DateTime]::Today.AddDays(-1).Year,
    $Month = [DateTime]::Today.AddDays(-1).Month,
    $strMonth = ([String]$Month).PadLeft(2,'0'),
    $Day = ([DateTime]::Today.AddDays(-1).Day),
    $strDay = ([String]$Day).PadLeft(2,'0'),
    $Date = "$Year" + "$strMonth" + "$strDay",
    $Hours = @(
        "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11",
        "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"
    ),
    $strHours = $Hours.ToString().PadLeft(2,'0'),
    $FilePattern = @("850_" + $Date + "*.txt"),
    $Files = (Get-ChildItem -Path $Path -Include $FilePattern -Recurse | 
        Select-Object -ExpandProperty CreationTime | Get-Date -f "HH")

)

ForEach ($Hour in $Hours) {

    if ($Hour -notin $Files) {

        Write-Host "There's no file present for $Hour o'clock for $Date."

    } else {

        Write-Host "There's at least one file for $Hour o'clock for $Date."

    }

}
...