Сохраните количество файлов x и удалите все остальные - Powershell - PullRequest
19 голосов
/ 11 января 2012

Я пытаюсь написать скрипт, который будет просматривать набор папок и хранить только последние 10 файлов. Файлы в каждой папке могут создаваться ежедневно, еженедельно или ежемесячно. Мне нужен скрипт, чтобы сохранить 10 самых последних копий независимо от даты создания или даты изменения.

Используя другой пост, я создал приведенный ниже скрипт, который работает, но он не хранит 10 копий, он хранит любой файл, который не старше 10 дней.

$ftppath = "C:\Reports"
Get-ChildItem $ftppath -recurse *_Report_*.zip -force|where {$_.lastwritetime -lt (get-date).adddays(-10)} |Remove-Item -force

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

# Keeps latest 10 files from a directory based on Creation Time

#Declaration variables
$path = "C:\Reports"                               # For example $path= C:\log\*.tmp
$total= (ls $path).count - 10 # Change number 5 to whatever number of objects you want to keep
# Script
ls $path |sort-object -Property {$_.CreationTime} | Select-Object -first $total | Remove-Item -force

Ошибка: Select-Object: не удалось проверить аргумент параметра «Первый». Аргумент -7 меньше минимально допустимого диапазона 0. Укажите аргумент, который больше 0, а затем повторите команду.

Ответы [ 4 ]

42 голосов
/ 11 января 2012

Вы можете отсортировать по CreationTime по убыванию и пропустить первые 10. Если файлов меньше 10, они не будут удалены.

gci C:\temp\ -Recurse| where{-not $_.PsIsContainer}| sort CreationTime -desc| 
    select -Skip 10| Remove-Item -Force
8 голосов
/ 11 января 2012

Обновлено

$path = "C:\TestDir"

# Create 12 test files, 1 second after each other
1..12 | % {
    Remove-Item -Path "$path\$_.txt" -ea SilentlyContinue
    $_ | Out-File "$path\$_.txt"
    Start-Sleep -Seconds 1
}

$files = Get-ChildItem -Path $path -Recurse | Where-Object {-not $_.PsIsContainer}
$keep = 10
if ($files.Count -gt $keep) {
    $files | Sort-Object CreationTime | Select-Object -First ($files.Count - $keep) | Remove-Item -Force -WhatIf
}

Удалите параметр -WhatIf в Remove-Item, когда вы будете готовы к реальному удалению.

1 голос
/ 03 ноября 2016

@ Энди: Мой представитель слишком мал, чтобы комментировать, поэтому отправляю ответ.Если вы получаете странные результаты, это может быть связано с тем, что вы просматриваете в проводнике Windows, который по умолчанию показывает дату последнего изменения вместо даты создания.Чтобы получить результаты, согласующиеся с результатами, показанными в проводнике Windows, замените LastWriteTime на CreationTime следующим образом: gci C: \ temp \ -Recurse |где {-не $ _. PsIsContainer} |сортировать LastWriteTime -desc |выберите -Skip 10 |Remove-Item -Force

0 голосов
/ 09 мая 2019

Как вызвать эту команду GCI на сервере SQL, пробовал приведенный ниже код, но возвращал ошибку

declare @deleteoldtempxe nvarchar(1000)
        set @deleteoldtempxe='powershell.exe gci '+''''+ 'I:\New folder\'+''''+' -Recurse| where{-not $_.PsIsContainer}| sort CreationTime -desc| 
    select -Skip 1| Remove-Item -Force'
    select @deleteoldtempxe

EXEC master.dbo.xp_cmdshell @deleteoldtempxe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...