#powershell #powershell-3.0
#powershell #powershell-3.0
Вопрос:
У меня есть сценарий powershell, который я пишу, где мне нужно сохранять ежедневные резервные копии за текущий месяц, резервные копии на конец месяца за год и удалять все остальное, кроме этого.
$ThisYear = (Get-Date).year
$DailyLogs = (Get-Date).month
#Clean-Up Old Backup Files
Get-ChildItem 'D:' | ForEach-Object {
if ( $_.LastWriteTime.Year -gt $ThisYear) {
Remove-Item
}
Elsif ( $_.LastWriteTime.Month -gt $ThisMonth -and $_.LastWriteTime.Date -ne ) {
Remove-Item
}
Пока это должно удалить все файлы резервных копий, которые не относятся к текущему году. Часть, которую я пытаюсь решить, заключается в том, как удалить ежедневные резервные копии, за исключением файлов резервных копий на конец каждого месяца после текущего месяца. Я застрял на том, как получить -ne в последний день любой заданной части месяца.
Редактировать:
#Clean-Up Old Backup Files
Get-ChildItem 'D:Server Backup' | ForEach-Object {
if ( $_.LastWriteTime.Year -gt $ThisYear) {
Remove-Item
}
Elsif ( $_.LastWriteTime.Month -gt $ThisMonth -and $_.LastWriteTime.Date -ne [System.DateTime]::DaysInMonth($_.LastWriteTime.Year, $($_.LastWriteTime.Month))) {
Remove-Item
}
}
Основываясь на комментарии Ли, вот моя идея.
Альтернатива с 30-дневным переходом и началом месяца:
$RollingYear = (Get-Date).AddDays(-365)
$Rolling30Days = (Get-Date).AddDays(-30)
if ( $_.LastWriteTime.AddDays(-365) -lt $RollingYear) {
Remove-Item
}
Elseif ( $_.LastWriteTime.AddDays(-30) -lt $Rolling30Days -and $_.LastWriteTime.Date -ne (Get-Date -Year $_.LastWriteTime.Year, -Month $_.LastWriteTime.Month -Day 1)) {
Remove-Item
}
Комментарии:
1. это даст вам последний день любого заданного месяца >>
[datetime]::DaysInMonth($YearNumber, $MonthNumber)
<< [ усмешка ]2. Правильно ли выглядит редактирование?
3. Если у кого-нибудь есть какие-либо идеи по поводу скользящего 30-дневного кода, сохраняющего начало каждого месяца, это также сработало бы.
4. Существуют также следующие способы.
$_.LastWriteTime.AddDays(1).Day -ne 1
.5. @Shenanigator — это выглядит хорошо! [ ухмылка ]
Ответ №1:
Я полагаю, это то, что вы ищете:
param($Path)
$Now = (get-date)
$ThisYear = $Now.AddYears(-1).Year
#Clean-Up Old Backup Files
Get-ChildItem $path | ForEach-Object {
if ( $_.LastWriteTime.Year -lt $ThisYear)
{
write-output "-- would have deleted $($_.fullname) $($_.LastWriteTime.DateTime)"
}
Elseif ($_.LastWriteTime.Day -ne [System.DateTime]::DaysInMonth($_.LastWriteTime.Year, $($_.LastWriteTime.Month)))
{
write-output "would have deleted $($_.fullname) $($_.LastWriteTime.DateTime)"
}
else
{
Write-Output "saved $($_.FullName) $($_.LastWriteTime.DateTime)"
}
}
Я предполагал, что вы хотите сохранить 12 месяцев со дня запуска скрипта.
Я использовал это, чтобы протестировать ваш скрипт:
for ($i = 1; $i -lt 500; $i )
{
new-item "$i.txt"
(Get-ChildItem "$i.txt").lastwritetime = (get-date).AddDays(-$i)
}
Я прокомментировал первые два вывода для записи, и вот мой результат:
saved C:temptemp103.txt Friday, November 30, 2018 9:38:00 PM
saved C:temptemp13.txt Thursday, February 28, 2019 9:37:59 PM
saved C:temptemp133.txt Wednesday, October 31, 2018 9:38:00 PM
saved C:temptemp164.txt Sunday, September 30, 2018 9:38:00 PM
saved C:temptemp194.txt Friday, August 31, 2018 9:38:00 PM
saved C:temptemp225.txt Tuesday, July 31, 2018 9:38:00 PM
saved C:temptemp256.txt Saturday, June 30, 2018 9:38:00 PM
saved C:temptemp286.txt Thursday, May 31, 2018 9:38:00 PM
saved C:temptemp317.txt Monday, April 30, 2018 9:38:01 PM
saved C:temptemp347.txt Saturday, March 31, 2018 9:38:01 PM
saved C:temptemp378.txt Wednesday, February 28, 2018 9:38:01 PM
saved C:temptemp406.txt Wednesday, January 31, 2018 9:38:01 PM
saved C:temptemp41.txt Thursday, January 31, 2019 9:37:59 PM
saved C:temptemp72.txt Monday, December 31, 2018 9:37:59 PM