2016-10-28 3 views
0

В настоящее время я новичок в PowerShell, и я создал скрипт на основе собранной информации в сети, которая будет выполнять операцию удаления найденных файлов в папке с их LastWriteTime меньше 1 день.Windows PowerShell - удалить файлы старше X дней

В настоящее время сценарий выглядит следующим образом:

$timeLimit = (Get-Date).AddDays(-1) 
$oldBackups = Get-ChildItem -Path $dest -Recurse -Force -Filter "backup_cap_*" | 
       Where-Object {$_.PSIsContainer -and $_.LastWriteTime -lt $timeLimit} 

foreach($backup in $oldBackups) 
{ 
    Remove-Item $dest\$backup -Recurse -Force -WhatIf 
} 

Насколько я знаю, команда -WhatIf будет выводить на консоль, что команда «должна» делать в реальных сценариях. Проблема в том, что -WhatIf ничего не выводит, и даже если я удалю его, файлы не будут удалены, как ожидалось.

Сервер - это Windows 2012 R2, и команда запускается в PowerShell ISE V3.

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

+0

2) Если вы хотите удалить файлы, почему вы только включая папки с '$ PSIsContainer'? 3) Если это ваш скрипт, откуда исходит $ dest? Если он не определен, gci будет читать текущий рабочий каталог без ошибок. 4) Вы подтвердили, что '$ oldBackups' имеет что-нибудь в нем? 5) Вызывает ли «Удалить-элемент» какие-либо исключения из файлов, которые не существуют? – TessellatingHeckler

+0

$ dest объявлен выше во внешней области. Это рабочий каталог сценария. Там создаются резервные копии. И нет, никаких исключений не бросают. Что касается $ PSIsContainer, вы правы. Мы решили, что резервные копии не будут находиться в папке, они будут непосредственно в рабочем каталоге, поэтому в основном резервные копии будут находиться под шаблоном backup_cap_dateOfWrite, который выводится mysqldump. – darksleep

ответ

2

Я сделал это в трубе

Get-ChildItem C:\temp | ? { $_.PSIsContainer -and $_.LastWriteTime -lt $timeLimit } | Remove-Item -WhatIf 

Это работал для меня. Поэтому вам не нужно заботиться о правильном пути к файлу.

1

другое решение

$timeLimit = (Get-Date).AddDays(-1) 
Get-ChildItem C:\temp2 -Directory | where LastWriteTime -lt $timeLimit | Remove-Item -Force -Recurse 
0

Оригинальный вопрос был $dest\$backup бы предположить, что каждый файл был в корневой папке. Но, используя свойство fullname на $backup, вам не нужно статически определять каталог.

Еще одно замечание, что Remove-Item принимает массивы строк, так что вы также могли бы избавиться от foreach

Вот исправление для вашего скрипта, без использования трубопровода. Обратите внимание, что, так как я использовал метод where это требует, по крайней мере, версия 4

$timeLimit = (Get-Date).AddDays(-1) 
$Backups = Get-ChildItem -Path $dest -Directory -Recurse -Force -Filter "backup_cap_*" 
$oldBackups = $backups.where{$_.LastWriteTime -lt $timeLimit} 
Remove-Item $oldBackups.fullname -Recurse -Force -WhatIf