Как использовать PowerShell для поиска самого старого файла в вашей системе

Опубликовано: 16 Марта, 2023
Как использовать PowerShell для поиска самого старого файла в вашей системе

Недавно я написал статью, в которой рассказал о том, как выполнять различные манипуляции с датами в PowerShell. В этой статье я написал простой скрипт PowerShell, который составляет список файлов старше определенной даты. Идея состоит в том, что вы сможете снизить затраты на хранение, обнаружив и затем архивируя устаревшие файлы. После написания этой статьи я начал задаваться вопросом, можно ли использовать PowerShell для поиска самого старого файла в папке или даже, возможно, самого старого файла на всем томе. Как оказалось, довольно легко опираться на концепции, которые я обсуждал ранее, и создать такой сценарий.

Для обзора вот как выглядел мой исходный скрипт сравнения дат:

$A = (Get-Date-Год 2017-Месяц 01-День 02)

$X = Get-ChildItem Readme.txt
$X.LastWriteTime
$X.LastWriteTime -GT $A

Этот конкретный сценарий был очень простым. Я сохранил дату, с которой хотел провести сравнение (в данном случае 2 января 2017 г.), в переменной с именем $A. Затем я создал вторую переменную с именем $X, которую я сопоставил с файлом (в данном случае Readme.txt). Затем я сравнил дату файла ($X.LastWriteTime) с датой сравнения ($A). Сценарий возвращал значение True, если файл был более поздним, чем дата, хранящаяся в $A. Достаточно просто.

Самый старый файл на томе

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

$FileDate = (Get-Date-Format g)
$путь = "C:"
Get-ChildItem -Path $path -Recurse | ForEach-Object {
if ($_.LastWriteTime -lt $FileDate -and -not $_.PSIsContainer) {
$FileDate = $_.LastWriteTime
$СтарыйФайл = $_.ПолноеИмя
}
}
Write-Host 'Самый старый файл в системе: ' $OldFile
$FileDate

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

Итак, первое, что делает этот скрипт, — это создает переменную с именем $FileDate. Переменная $FileDate устанавливается на сегодняшнюю дату и текущее время. Причина, по которой я это делаю, заключается в том, что найти самый старый файл в системе можно только с помощью серии сравнений, и нам нужно начальное значение для сравнения. Можно с уверенностью сказать, что самый старый файл в системе будет старше текущей даты и времени, поэтому текущая дата и время являются хорошей отправной точкой.

Следующая строка скрипта задает путь поиска. Прямо сейчас я установил путь поиска C:, но вы можете использовать другой путь, если хотите. Стоит отметить, что если вы планируете искать по сетевому пути, то вы, вероятно, не сможете использовать букву сетевого диска в переменной $Path. Я смог заставить сценарий работать только с сетевым диском, назначив переменной $Path путь UNC (например, \192.168.0.1h$).

Третья строка скрипта извлекает сравниваемый файл. В простом сценарии сравнения, который я представил в начале этой статьи, я использовал командлет Get-ChildItem в сочетании с определенным именем файла (Readme.txt). Однако в данном случае я использую параметр -Path, чтобы указать командлету путь, а не проверять один файл. Вы также заметите, что я использую параметр -Recurse. Этот параметр указывает Get-ChildItem проверить все существующие вложенные папки по указанному пути. Если вы хотите проверять только файлы по указанному пути, но не во вложенных папках, просто опустите параметр -Recurse.

Эта же строка кода также устанавливает цикл ForEach-Object. Это позволяет нам исследовать каждый файл по отдельности.

В цикле ForEach-Object есть три строки кода. Первая строка выполняет фактическое сравнение дат, сравнивая дату файла ($_.LastWriteTime) с начальной датой ($FileDate). Кстати, сравнение производится с использованием оператора -LT. Если вы измените это значение на -GT (и вручную установите для переменной $FileDate в первой строке прошедшую дату), сценарий найдет самый новый файл в системе.

Эта строка кода также проверяет, что мы проверяем файл, а не контейнер (-и -не $_.PSIsContainer).

Езда на петле

Если файл оказывается старше текущей даты и времени, сценарий выполняет еще один цикл кода. Этот цикл делает две вещи. Во-первых, он изменяет переменную $FileDate для хранения даты и времени файла, а не текущей даты и времени. Таким образом, последующие сравнения будут производиться с датой файла, а не с текущей датой. Каждый раз, когда сценарий находит файл старше того, что хранится в переменной $FileDate, он перезаписывает переменную $FileDate датой файла.

Еще одна вещь, которую выполняет цикл, — это присвоение полного имени файла переменной с именем $OldFile. Если вам интересно, $_.FullName включает в себя как имя файла, так и путь к нему. Если по какой-либо причине вам нужно знать только имя файла, но не путь, вы можете использовать $_.Name вместо $_.FullName.

По завершении цикла переменная $OldFile будет содержать путь и имя самого старого файла в системе. В переменной $FileDate будет храниться дата файла. Теперь осталось только вывести информацию. Для этого я просто использую команду Write-Host и имена переменных, которые я хочу вывести. Результат работы скрипта вы можете увидеть на рисунке ниже. Изображение 4367

Возьмите это отсюда

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