#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! Похоже, что это отлично работает в моем тесте.