Показать полную графическую версию : [решено] Удаление старых файлов/папок если их кол-во больше n
.ps1 просто схлопывается через секунду, а если через cmd, то "Для продолжения нажмите любую клавишу . . ." и после нажатия такая-же ситуация .... И пробовал запускать под админом. »
Тогда откройте консоль powershell и отдельно каждую строку в консоли запускайте, а после возникновения исключения сделайте скриншот и приложите сюда к сообщению...
Коллега меня мамонтом обозвал!!! »
Да прям уж так мамонтом... :)
Совсем нет. Просто на cmd не практикую уже, ибо powershell хватает... а без практики, надо читать мануалы, составлять зубодробильный код, потом проверять всё, что получилось... нет, проще на powershell, всё же... :)
megaloman, чего-то толи я тупой, толи лыжи не едут ....
Подставил в переменные даты 2023 год 09 января и всё равно не удаляются файлы ....
Знаю, что уже надоел :sorry:
Может всё таки попробовать с .ps1 ?
Вот такой вариант хорошо справляется с задачей, но в нём надо подкорректировать , чтобы как я и писал ранее, не удалялись закинутые в данный Obmen старинные файлы.
$Now = Get-Date
#количество дней, файлы старше которых должны быть удалены
$Days = "10"
#путь до отчищаемой папки
$TargetFolder = "\\FS\Obmen\"
#желаемые расширения файлов
$Extension = "*"
#находим все файлы, которые подходят под наши критерии. А также сортируем список, что бы всё шло от большего пути к меньшему
$LastWrite = $Now.AddDays(-$Days)
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where{$_.CreationTime -le "$LastWrite" -and $_.LastWriteTime -le "$LastWrite"} | Sort-Object -Descending {$_.FullName.Split('\').Count},FullName
foreach ($File in $Files)
{
if ($File -ne $NULL -and !$File.PSIsContainer)
{
write-host "Deleting File $File" -ForegroundColor "Magenta"
Remove-Item $File.FullName -Force | out-null
}
#Собственно, удаляем файл
elseif ($File -ne $NULL -and $File.PSIsContainer)
{
$FolderInfo = get-Childitem $File.FullName | Measure-Object
if ($folderInfo.count -eq 0)
{
write-host "Deleting directory - $File" -foregroundcolor "green"
Remove-Item $File.FullName -Force | out-null
}
}
else
{
Write-Host "No more files to delete!" -foregroundcolor "Green"
}
}
YuS_2, сделайте скриншот и приложите сюда к сообщению... »
POV, т.е. никакого исключения нет, хотя это очень странно... не вижу в первой строке кавычек... а без них никуда. :)
Кроме того, возможно, файлы, которые присутствуют в каталоге, не подходят под условие на удаление. Какая у них дата создания? (можно посмотреть в свойствах файла)
Для проверки, покажите вывод команд:
$folder = 'D:\TEST\'
dir $folder -file|select name,creationtime,lastwritetime
И про кавычки не забудьте...
POV, а, да... на скриншоте видно, что Вы весь пакет строк пытались запустить за один раз... но надо построчно именно, т.е. каждую строку вставляем, Enter и т.д. ...
DJ Mogarych
11-01-2023, 14:31
Да можно и пакет, просто кавычек не было, поэтому шелл думал, что это продолжение одной строки.
megaloman
11-01-2023, 14:31
Подставил в переменные даты 2023 год 09 января и всё равно не удаляются файлы .... »1.Покажите код, где Вы это проделали. Я не предусматривал в своём коде такую манипуляцию.
2. В командной строке запустите Dir \\fs\obmen\*.* >C:\obmen.txt
Хотя бы небольшой кусок получившегося файла приложите к сообщению.
Да можно и пакет »
Да, конечно, но пакетом, как раз, не всегда можно определить место исключения ... тут ведь, непонятная ситуация, поэтому и предложил построчно, в целях дебага уточнить место затыка...
DJ Mogarych
11-01-2023, 16:01
На первом скрине вторая строка начинается с >>, соответственно, первая не закончилась.
На первом скрине вторая строка начинается с >>, соответственно, первая не закончилась. »
В этом и дело... исключения нет, проблема не решена... просто лишняя переписка на форуме. А если запустить первую строку отдельно, всё будет понятно, ибо вывалится исключение с описанием проблемы... хотя, сейчас попробовал в пакете без кавычек, исключение всё равно выдается... странно, как у POV, так получилось... ладно, придет - расскажет...
Здравствуйте ещё раз все !
Прошу прощения - были форс мажорные обстоятельства ... :sorry: Не до скриптов было
С батником, увы, так и не заработало :unsure:
Итак: Действительно вот такой вариант РАБОТАЕТ !!! Удаляет файлы через n-дней только ПО ВРЕМЕНИ СОЗДАНИЯ в данной директории, не обращая внимания на дату изменения.
$Now = Get-Date
$Days = "10"
$TargetFolder = "\\srv-zavod\Obmen\"
$Extension = "*"
$LastWrite = $Now.AddDays(-$Days)
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where{$_.CreationTime -le "$LastWrite" -and $_.LastWriteTime -le "$LastWrite"} | Sort-Object -Descending {$_.FullName.Split('\').Count},FullName
foreach ($File in $Files)
{
if ($File -ne $NULL -and !$File.PSIsContainer)
{
write-host "Deleting File $File" -ForegroundColor "Magenta"
Remove-Item $File.FullName -Force | out-null
}
elseif ($File -ne $NULL -and $File.PSIsContainer)
{
$FolderInfo = get-Childitem $File.FullName | Measure-Object
if ($folderInfo.count -eq 0)
{
write-host "Deleting directory - $File" -foregroundcolor "green"
Remove-Item $File.FullName -Force | out-null
}
}
else
{
Write-Host "No more files to delete!" -foregroundcolor "Green"
}
}
Теперь остался ,надеюсь, последний вопрос: Какие строки добавить в этот .ps1 и куда, чтобы НЕ УДАЛЯЛИСЬ ИМЕННО СОЗДАННЫЕ ПАПКИ (чтобы сотрудникам заново не приходилось их создавать) или ПРОПИСЫВАТЬ ПАПКИ-ИСКЛЮЧЕНИЯ (что менее удобно)
Заранее благодарю за отзывчивость
P.S.
Вот бы лог куда-нить бы сливался ещё по удаленным файлам ...
Удаляет файлы через n-дней только ПО ВРЕМЕНИ СОЗДАНИЯ в данной директории, не обращая внимания на дату изменения. »
Не знаю, где Вы взяли этот скрипт, здесь Вам показывали другой... :)
Тем не менее, он таки учитывает обе даты... в нем будут удалятся и файлы, и каталоги по дате создания и дате изменения старше $Days дней.
Какие строки добавить в этот .ps1 и куда, чтобы НЕ УДАЛЯЛИСЬ ИМЕННО СОЗДАННЫЕ ПАПКИ (чтобы сотрудникам заново не приходилось их создавать) »
Всё тот же скрипт, предложенный DJ Mogarych, с корректировкой для лог-файла (будет перезаписываться при каждом запуске скрипта):
$folder = 'D:\Test\'
$fout = '.\log_delete.txt'
$n = 10
$olderThan = (get-date).Date.AddDays(-$n)
dir $folder -file -rec -force|? {$_.creationtime -lt $olderThan -and $_.lastwritetime -lt $olderThan}|
tee $fout|del -force -WhatIf
YuS_2
СПАСИБО ОГРОМНОЕ !!!!!! :yahoo:
Куда высылать пиво ? :up
Но для теста поставил 1 день и скрипт НЕ УДАЛЯЕТ файлы, а только констатирует. И кстати лог тоже не появляется
PS C:\Users\it>> $folder = 'D:\Test\'
$fout = '.\log_delete.txt'
$n = 1
$olderThan = (get-date).Date.AddDays(-$n)
dir $folder -file -rec -force|? {$_.creationtime -lt $olderThan -and $_.lastwritetime -lt $olderThan}|
tee $fout|del -force -WhatIf
WhatIf: Выполнение операции "Удаление файла" над целевым объектом "D:\Test\batnik.bat".
WhatIf: Выполнение операции "Удаление файла" над целевым объектом "D:\Test\README.md".
Куда высылать пиво ? »
На почту "до востребования"... :)
С наступающим СНГ!
Но для теста поставил 1 день и скрипт НЕ УДАЛЯЕТ файлы, а только констатирует. И кстати лог тоже не появляется »
Потому, что файлы не подходят по критериям отбора...
1. Если ставить 1 день, то дата создания И дата изменения файла должна быть старее вчерашней даты.
2. Лог не появляется потому, что нет списка файлов.
3. Хмм, что значит констатирует? Если таки файлы отбор проходят, то: Посмотрите вывод скрипта... если перечислены правильные файлы на удаление, то уберите параметр -WhatIf в командлете del (сам командлет имеет другое полное название, это его алиас) и выполните скрипт повторно для реального удаления файлов... »
И по логу: если запускаете командлеты в консоли, то лучше укажите абсолютный путь для лог-файла, ибо создаваться в таком виде он будет в текущем каталоге... либо рядом со скриптом, если запускаете именно скрипт
YuS_2, то уберите параметр -WhatIf в командлете del »
Да, так всё сработало !!! :yahoo:
И лог тоже появился!
Ещё раз ВСЕМ ОГРОМНОЕ СПАСИБО !!!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.