Условия с несколькими инструкциями PowerShell — сравнение дат в именах файлов

#powershell

#powershell

Вопрос:

То, что я пытаюсь сделать, это любое имя файла со значением «D», которое на 4 дня или старше значения «t» — сделайте что-нибудь. Например: (t = сегодняшний день) (d = обычно совпадает с t, но иногда оно на 4 дня или более старше)

c:temptest_d210115_t210115.txt — ничего не будет делать

c:temptest_d210112_t210115.txt — ничего не будет делать

c:temptest_d210108_t210115.txt — сделай что — нибудь

c:temptest_d210111_t210115.txt — сделай что — нибудь

 $DATA_DATE = ((Get-Date).AddDays(-4).ToString("yyMMdd"))
$TODAY_DATE = (get-date).ToString("yyMMdd")
$TXT_FILES = Get-ChildItem -Path C:temp*

$DATA = $TXT_FILES.Name -filter "*d$TODAY_DATE*"

if ($data -like "*d$DATA_DATE*") -and ($data -le "*d$DATA_DATE*"){

    Write-Output "$data"
}
 

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

Ответ №1:

Если я правильно понимаю, даты в именах файлов должны сравниваться, и если дата, указанная после d , составляет 4 дня или более меньше (старше), чем дата, указанная после t , вы хотите что-то сделать с этим файлом.

 Get-ChildItem -Path 'C:temp' -Filter '*.txt' | 
    Where-Object { $_.BaseName -match 'd(d{6})_t(d{6})

Вывод:

 C:Temptest_d210108_t210115.txt
C:Temptest_d210111_t210115.txt
 

Сведения о регулярных выражениях:

 d              Match the character “d” literally
(              Match the regular expression below and capture its match into backreference number 1
   d          Match a single digit 0..9
      {6}      Exactly 6 times
)             
_t             Match the characters “_t” literally
(              Match the regular expression below and capture its match into backreference number 2
   d          Match a single digit 0..9
      {6}      Exactly 6 times
)             
$              Assert position at the end of the string (or before the line break at the end of the string, if any)
 

Комментарии:

1. Кажется, работает очень хорошо до последнего дня месяца. Я заметил, что "d210131_t210201" это будет помечено до тех пор, пока значение "d" не достигнет значения "d21002 ..".

2. @kurama О чем я думал сначала... Преобразование в [int], казалось, сработало, но было ошибочным, как вы прокомментировали. Теперь я отредактировал свой ответ и использую преобразования в реальные объекты DateTime

3. Спасибо @Theo! Похоже, что это отлично работает в моем тесте.

} |
ForEach-Object {
$dateD = [datetime]::ParseExact($matches[1], 'yyMMdd', $null)
$dateT = ([datetime]::ParseExact($matches[2], 'yyMMdd', $null)).AddDays(-4)
if ($dateD -le $dateT) {
# do something with this file. For demo, just output the file's FullName
$_.FullName
}
}
Вывод:


Сведения о регулярных выражениях:


Комментарии:

1. Кажется, работает очень хорошо до последнего дня месяца. Я заметил, что «d210131_t210201» это будет помечено до тех пор, пока значение «d» не достигнет значения «d21002 ..».

2. @kurama О чем я думал сначала… Преобразование в [int], казалось, сработало, но было ошибочным, как вы прокомментировали. Теперь я отредактировал свой ответ и использую преобразования в реальные объекты DateTime

3. Спасибо @Theo! Похоже, что это отлично работает в моем тесте.