Как я могу сравнить и отфильтровать файлы, которые были изменены за последние 20 минут, с помощью powershell?

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

$Today = (Get-Date).AddMinutes(-20).ToString("MM/dd/yyyy hh:mm tt")
$filecreation = Get-ChildItem "D:\logs\" -Recurse
Foreach($file in $filecreation)
{
    if ($file.LastWriteTime.ToString("MM/dd/yyyy hh:mm tt") -gt $Today)
    {
        Write-Host $file.LastWriteTime.ToString("MM/dd/yyyy hh:mm tt")
    }
}

Вывод ниже:

08/26/2020 07:39 PM
08/26/2020 07:54 PM
08/26/2020 10:58 AM
08/26/2020 07:54 PM
08/26/2020 12:01 AM
08/26/2020 12:01 AM
08/26/2020 12:01 AM

Проблема: Видите ли, у меня тоже есть файлы, написанные утром. Я тоже хочу сравнить AM и PM. Может кто-нибудь, пожалуйста, помогите мне с этим.

Кроме того, у меня есть несколько папок с датами внутри D:\logs. И то же самое также фиксируется на выходе. Я просто хочу сравнить файл и скопировать. Как я могу игнорировать папки в Get-ChildItem?

Пожалуйста помоги.

С уважением,

Митеш Агравал


person Mitesh Agrawal    schedule 26.08.2020    source источник
comment
Не преобразовывайте в строку при сравнении. Преобразовывать в строку только при выводе на консоль.   -  person AdminOfThings    schedule 26.08.2020


Ответы (2)


Хватит превращать [datetime] объектов в строки для сравнения!

Тип [datetime] уже поддерживает трехстороннее сравнение, поэтому сравнение строковых представлений существующих значений [datetime] совершенно не нужно — и если вы не используете формат даты со строгим порядком байтов (например, yyyyMMddHHmmss), он также победил. не работает должным образом — просто потому, что правила сортировки чего-либо в алфавитном порядке отличаются от сортировки по некоторому описанию времени.

# $Today is now a [datetime] value, not a string
$Today = (Get-Date).AddMinutes(-20)
$filecreation = Get-ChildItem "D:\logs\" -Recurse
Foreach($file in $filecreation)
{
    # Now we just compare them directly as-is
    if ($file.LastWriteTime -gt $Today)
    {
        Write-Host $file.LastWriteTime.ToString("MM/dd/yyyy hh:mm tt")
    }
}
person Mathias R. Jessen    schedule 26.08.2020

Используйте атрибут !D для поиска файлов, а не каталогов. Вы можете использовать следующий код. Это устраняет поиск в подкаталогах (с помощью !Directory или !D) и использует 24-часовой формат для получения окончательных файлов с добавлением AM и PM.

$Today = (Get-Date).AddMinutes(-20).ToString("MM/dd/yyyy HH:mm tt")
$filecreation = Get-ChildItem -Attributes !Directory -Path "D:\logs\" 
Foreach($file in $filecreation)
{
    if ($file.LastWriteTime.ToString("MM/dd/yyyy HH:mm tt") -gt $Today)
    {
        Write-Host $file.LastWriteTime.ToString("MM/dd/yyyy HH:mm tt")
    }
}

Recurse не требуется до тех пор, пока не потребуется сравнить файлы подкаталогов.

person vamshib69    schedule 26.08.2020
comment
Что касается этого...[Использовать атрибут !D для поиска файлов, а не каталогов]... Get-ChildItem имеет параметр -File именно по этой причине. - person postanote; 27.08.2020
comment
да, файл также может использоваться без рекурсии или может передавать несколько атрибутов/параметров из -Attributes - person vamshib69; 27.08.2020