С помощью PowerShell можно получить значения или изменить атрибуты файлов и папок на файловой системе. В этой статье мы рассмотрим, как работать с временными метками файлов с помощью PowerShell.
Вывести дату создания, изменения и последнего доступа (открытия) файла:
Get-ChildItem -Path C:\PS\Check-KBInstalled.ps1 | select Name, Length, CreationTime, LastWriteTime, LastAccessTime
С помощью меток времени можно быстро найти все файлы созданные/измененные за определенный промежуток времени. Например, вывести все файлы в папке, созданные за последние 30 дней:
Get-ChildItem -Path c:\ps -Recurse| where -Property CreationTime -gt (Get-Date).AddDays(-30)
Можно изменить значение любой из временных меток файла. Например, изменить дату создания файла:
(Get-ChildItem -Path C:\PS\Check-KBInstalled.ps1).CreationTime=Get-Date('21.05.2010')
Изменить время последнего изменения файла на текущую дату:
(Get-ChildItem -Path C:\PS\Check-KBInstalled.ps1).LastWriteTime=Get-Date
Проверим, что временные метки файла были изменены (с помощью PowerShell и в свойствах файла в проводнике Windows):
Эти же команды используются, чтобы изменить дату создания/модификации папки:
(Get-Item -Path C:\PS\).CreationTime=Get-Date('21.05.2010 10:10')
Если нужно изменить дату модификации у всех файлов и вложенных папок, можно использовать такой однострочник:
dir c:\PS -recurse | %{$_.LastWriteTime = Get-Date('21.05.2023 10:10')}
Если нужно сделать так, чтобы даты модификации файлов немного отличались (в этом примере на 1 минуту):
dir c:\ps -file -recurse|%{$i=0} {$_.LastWriteTime = (Get-Date('21.05.2023 10:10')).AddMinutes($i); $i++}
Обратите внимание, что формат даты будет отличаться в зависимости от локали компьютера. Например, на компьютере с русской локалью при попытке задать дату в американском формате (
MM/DD/YYYY
) будет ошибка:
Get-Date : Cannot bind parameter 'Date'. Cannot convert value "12/31/2024" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."
Для универсальности скрипта можно предварительно конвертировать дату в нужный формат с помощью метода ParseExact:
(Get-Item -Path "C:\PS").CreationTime = [datetime]::ParseExact("12/31/2024", "MM/dd/yyyy", $null)
Если формат даты в выражении указан неверно, появится ошибка:
The DateTime represented by the string is not supported in calendar System.Globalization.GregorianCalendar.