Powershell удалить файлы старше n дней
The opinion expressed by me is not an official position of Microsoft
Андрей, RI это и есть Remove-ItemThe opinion expressed by me is not an official position of Microsoft
ок, я имел в виду
У вас все файлы могут отсеятся или на этом where или на следующем where где у вас фильтруются даты
The opinion expressed by me is not an official position of Microsoft
скрипт пишете и дебажите в ise или блокноте?
в соседней теме на которую ссылается Андрей были проблемы с кодировкой которой некисло грешит блокнот
вы показали вывод какой команды? что в середине скрипта?
The opinion expressed by me is not an official position of Microsoft
скрипт пишете и дебажите в ise или блокноте?
в соседней теме на которую ссылается Андрей были проблемы с кодировкой которой некисло грешит блокнот
вы показали вывод какой команды? что в середине скрипта?
The opinion expressed by me is not an official position of Microsoft
Я все делаю в ISE, вот вывод
ок, вывод правильный? папка d:\test\old не попадает в список?
если все ок, продолжаем и добавляем следующий where и смотрим вывод
если вывод будет пустым то скрипт не видит ниодного файла у которого creationtime будет меньше чем 3 для назад
The opinion expressed by me is not an official position of Microsoft
ок, вывод правильный? папка d:\test\old не попадает в список?
если все ок, продолжаем и добавляем следующий where и смотрим вывод
если вывод будет пустым то скрипт не видит ниодного файла у которого creationtime будет меньше чем 3 для назад
The opinion expressed by me is not an official position of Microsoft
Вот выполнил два вывода. Обратите внимание на папку с файлами, там и за сегодня есть и за апрель. И вообще то мне нужно чтоб удалялись старые, старше 3 дней.
проверьте что в $ChDaysDel у вас находится правильная дата и посмотрите на вывод
есть подозрение что либо параметр написан неправильно, либо какие-то даты не оответвуют
То что вы показываете на скрине не creatinontime a lastwritetime
The opinion expressed by me is not an official position of Microsoft
проверьте что в $ChDaysDel у вас находится правильная дата и посмотрите на вывод
есть подозрение что либо параметр написан неправильно, либо какие-то даты не оответвуют
То что вы показываете на скрине не creatinontime a lastwritetime
The opinion expressed by me is not an official position of Microsoft
Вот вывод. Если я правильно понял то файлы были созданы недавно, поэтому не удалял. Так? но эти файлы были созданые давно, а вот сюда скопированы вчера.
Я извиняюсь,) теперь объединил все свои задачи в один скрипт. Но теперь Compress-Archive архивирует папку OLD (C:\TEST\OLD). Мне нужно чтоб НЕ архивировал саму папку OLD в которую я архивирую файлы из C:\TEST\.
1 Если хранить бекапы в том же каталоге который вы чистите, то потеря бекапов вопрос времени. Ошибки случаются (в основном человеческий фактор) поэтому лучше бекапы хранить снаружи.
В вашем случае D:\Test\ - файлы, и D:\Test-OLD - бекапы
2 не ошибка но такая форма записи имхо выглядит симпотичнее
3 так как у вас есть список файлов для удаления и он такой же как и список файлов для сжатия (как я понял) то стоит этим воспользоваться (это не требуется если папку OLD вынести наружу как я писал в п1)
Скрипт будет выглядеть приблизительно так:
The opinion expressed by me is not an official position of Microsoft
1 Если хранить бекапы в том же каталоге который вы чистите, то потеря бекапов вопрос времени. Ошибки случаются (в основном человеческий фактор) поэтому лучше бекапы хранить снаружи.
В вашем случае D:\Test\ - файлы, и D:\Test-OLD - бекапы
2 не ошибка но такая форма записи имхо выглядит симпотичнее
3 так как у вас есть список файлов для удаления и он такой же как и список файлов для сжатия (как я понял) то стоит этим воспользоваться (это не требуется если папку OLD вынести наружу как я писал в п1)
Спасибо огромное за помощь и терпение )
1. Я согласен с вами что OLD нужно выносить наружу, но не я решаю это, сказано мне сделать и не спорить )). Я вообще бэкапы храню на другом сервере.
Для того, что бы через powershell удалить файлы старше даты сначала нужно установить дату, которая нам нужна:
Можно дату задать несколькими днями назад. Это удобно для скриптов, которые будут все время висеть в планировщике:
Навигация по посту
На моем примере дата получится в таком формате:
Т.к. я не установил минуты и секунды - они взялись по умолчанию из текущего дня. Если мы не установим год, например, то он будет текущим 2019.
Получение списка файлов для последующего удаления в Powershell
Далее нам нужно использовать Get-Childitem для того что бы получить все файлы:
- Path - путь до директории
- Include - включает, в моем случае, все файлы которые кончаются на txt
- Recurse - поиск файлов не только в текущей папке, но и в подпапках.
У файла есть несколько свойств c датами (datetime). Все их увидеть можно так:
- CreationTime
- CreationTimeUtc
- LastAccessTime
- LastAccessTimeUtc
- LastWriteTime
- LastWriteTimeUtc
UTC значит, что дата будет в формате всемирного времени.
Удаление через powershell файлов старше даты
Меня интересует удаление файлов по дате создания. Для этого сделаем так:
Т.е. для каждого файла где свойство CreationDate (дата создания файла) LessThen (больше чем) дата в переменной произвести удаление. Таким образом мы удалили в powershell файлы старше определенной даты. Мы можем использовать и другие операторы сравнения:
Командлет Remove-Item удаляет один или несколько элементов. Так как она поддерживается многими поставщиками, она может удалять различные типы элементов, включая файлы, папки, разделы реестра, переменные, псевдонимы и функции.
Примеры
Пример 1. Удаление файлов с любым расширением имени файла
В этом примере удаляются все файлы с именами, включающими точку ( . ) из C:\Test папки. Так как команда задает точку, команда не удаляет папки или файлы без расширения имени файла.
Пример 2. Удаление некоторых файлов документов в папке
В этом примере удаляются из текущей папки все файлы, имеющие .doc расширение имени файла и имя, которое не содержит *1* .
Он использует подстановочный знак ( * ) для указания содержимого текущей папки. Он использует параметры Include и Exclude для указания удаляемого файла.
Пример 3. Удаление скрытых файлов, доступных только для чтения
Эта команда удаляет файл, который является скрытым и доступным только для чтения.
Для указания файла используется параметр Path . Для удаления используется параметр Force . Без принудительного удаления не удается удалить файлы только для чтения или скрытые файлы.
Пример 4. Рекурсивное удаление файлов во вложенных папках
Эта команда удаляет все CSV-файлы в текущей папке и все вложенные папки рекурсивно.
Так как параметр Recurse имеет известную проблему, команда в Remove-Item этом примере используется Get-ChildItem для получения нужных файлов, а затем использует оператор конвейера для их передачи Remove-Item .
В команде Get-ChildItem Path имеет значение ( * ), представляющее содержимое текущей папки. Он использует include для указания типа CSV-файла и использует recurse для рекурсивного извлечения. При попытке указать путь к файлу, например -Path *.csv , командлет интерпретирует тему поиска как файл без дочерних элементов, а рекурс завершается ошибкой.
Это поведение было исправлено в Windows версиях 1909 и более поздних версий.
Пример 5. Рекурсивное удаление подразделов
Эта команда удаляет раздел реестра OldApp и все его подразделы и значения. Он используется для Remove-Item удаления ключа. Указан путь, но имя необязательного параметра (Path) опущено.
Параметр Recurse удаляет все содержимое ключа OldApp рекурсивно. Если ключ содержит подразделы и не указан параметр Recurse , вам будет предложено подтвердить удаление содержимого ключа.
Пример 6. Удаление файлов с помощью специальных символов
В следующем примере показано, как удалить файлы, содержащие специальные символы, такие как скобки или скобки.
Пример 7. Удаление альтернативного потока данных
В этом примере показано, как использовать динамический параметр Stream командлета Remove-Item для удаления альтернативного потока данных. Параметр потока представлен в Windows PowerShell 3.0.
Параметр Get-Item Stream получает Zone.Identifier поток Copy-Script.ps1 файла. Remove-Item использует параметр Stream для удаления Zone.Identifier потока файла. Наконец, командлет показывает, Get-Item что Zone.Identifier поток был удален.
Параметры
Запрос подтверждения перед выполнением командлета. Дополнительные сведения см. в следующих статьях:
Этот параметр не поддерживается поставщиками, установленными с помощью PowerShell. Чтобы олицетворять другого пользователя или повысить свои учетные данные при выполнении этого командлета, используйте Invoke-Command.
Type: | PSCredential |
Position: | Named |
Default value: | Current user |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Указывает, как массив строк, элемент или элементы, которые этот командлет исключает в операции. Значение этого параметра определяет параметр Path. Введите элемент пути или шаблон, например *.txt . Можно использовать подстановочные знаки. Параметр Exclude действует только в том случае, если команда содержит содержимое элемента, например C:\Windows\* , где подстановочный знак указывает содержимое C:\Windows каталога.
При использовании recurse с exclude, exclude only filters results of the current directory. Если в вложенных папках есть файлы, соответствующие шаблону Exclude , эти файлы удаляются вместе с родительским каталогом.
Type: | String [ ] |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | True |
Указывает фильтр для уточнения параметра Path . Поставщик FileSystem — единственный установленный поставщик PowerShell, который поддерживает использование фильтров. Синтаксис языка фильтрации Файловой системы можно найти в about_Wildcards. Фильтры более эффективны, чем другие параметры, так как поставщик применяет их, когда командлет получает объекты, а не фильтрует объекты PowerShell после их извлечения.
Type: | String |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | True |
Заставляет командлет удалять элементы, которые не могут быть изменены, например скрытые или доступные только для чтения файлы или псевдонимы только для чтения или переменные. С помощью этого командлета нельзя удалять постоянные псевдонимы или переменные. Применение этого параметра зависит от конкретного поставщика. Дополнительные сведения см. в разделе about_Providers. Даже при использовании параметра Force командлет не может переопределить ограничения безопасности.
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Указывает, как массив строк, элемент или элементы, которые этот командлет включает в операцию. Значение этого параметра определяет параметр Path. Введите элемент пути или шаблон, например "*.txt" . Можно использовать подстановочные знаки. Параметр Include действует только в том случае, если команда включает содержимое элемента, например C:\Windows\* , где подстановочный знак указывает содержимое C:\Windows каталога.
Type: | String [ ] |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | True |
Указывает путь к одному или нескольким расположениям. Значение LiteralPath используется точно так же, как оно введено. Никакие символы не интерпретируются как знаки подстановки. Если путь содержит escape-символы, заключите его в одинарные кавычки. Одинарные кавычки говорят PowerShell, что никакие символы не интерпретируются как escape-последовательности.
Type: | String [ ] |
Aliases: | PSPath |
Position: | Named |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Указывает путь к удаляемым элементам. Можно использовать подстановочные знаки.
Type: | String [ ] |
Position: | 0 |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | True |
Указывает, что этот командлет удаляет элементы в указанных расположениях и во всех дочерних элементах расположений.
Параметр Recurse может не удалять все вложенные папки или все дочерние элементы. Это известная проблема
Это поведение было исправлено в Windows версиях 1909 и более поздних версиях.
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Параметр Stream — это динамический параметр, к которому Remove-Item добавляет поставщик FileSystem. Этот параметр работает только на дисках с файловой системой.
Можно использовать для Remove-Item удаления альтернативного потока данных, например Zone.Identifier . Однако не рекомендуется отменять проверки безопасности, которые блокируют файлы, загруженные из Интернета. Если вы убедитесь, что скачанный файл является безопасным, используйте Unblock-File командлет.
Этот параметр впервые появился в Windows PowerShell 3.0.
Type: | String [ ] |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | True |
Включает команду в активную транзакцию. Этот параметр доступен только при выполнении транзакции. Дополнительные сведения см. в разделе about_Transactions
Type: | SwitchParameter |
Aliases: | usetx |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Показывает, что произойдет при запуске командлета. Командлет не выполняется.
Type: | SwitchParameter |
Aliases: | wi |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
В этот командлет можно передать строку, содержащую путь, но не литеральный путь.
Выходные данные
Нет
Этот командлет не возвращает никакие выходные данные.
Примечания
Командлет Remove-Item предназначен для работы с данными, предоставляемыми любым поставщиком. Чтобы вывести список поставщиков, доступных в данном сеансе, введите командлет Get-PsProvider . Дополнительные сведения см. в разделе about_Providers.
При попытке удалить папку, содержащую элементы без использования параметра Recurse , командлет запрашивает подтверждение. Использование -Confirm:$false не подавляет запрос. Это сделано намеренно.
The Remove-Item cmdlet deletes one or more items. Because it is supported by many providers, it can delete many different types of items, including files, folders, registry keys, variables, aliases, and functions.
Examples
Example 1: Delete files that have any file name extension
This example deletes all of the files that have names that include a dot ( . ) from the C:\Test folder. Because the command specifies a dot, the command does not delete folders or files that have no file name extension.
Example 2: Delete some of the document files in a folder
This example deletes from the current folder all files that have a .doc file name extension and a name that does not include *1* .
It uses the wildcard character ( * ) to specify the contents of the current folder. It uses the Include and Exclude parameters to specify the files to delete.
Example 3: Delete hidden, read-only files
This command deletes a file that is both hidden and read-only.
It uses the Path parameter to specify the file. It uses the Force parameter to delete it. Without Force, you cannot delete read-only or hidden files.
Example 4: Delete files in subfolders recursively
This command deletes all of the CSV files in the current folder and all subfolders recursively.
Because the Recurse parameter in Remove-Item has a known issue, the command in this example uses Get-ChildItem to get the desired files, and then uses the pipeline operator to pass them to Remove-Item .
In the Get-ChildItem command, Path has a value of ( * ), which represents the contents of the current folder. It uses Include to specify the CSV file type, and it uses Recurse to make the retrieval recursive. If you try to specify the file type the path, such as -Path *.csv , the cmdlet interprets the subject of the search to be a file that has no child items, and Recurse fails.
This behavior was fixed in Windows versions 1909 and up.
Example 5: Delete subkeys recursively
This command deletes the "OldApp" registry key and all its subkeys and values. It uses Remove-Item to remove the key. The path is specified, but the optional parameter name (Path) is omitted.
The Recurse parameter deletes all of the contents of the "OldApp" key recursively. If the key contains subkeys and you omit the Recurse parameter, you are prompted to confirm that you want to delete the contents of the key.
Example 6: Deleting files with special characters
The following example shows how to delete files that contain special characters like brackets or parentheses.
Example 7: Remove an alternate data stream
This example shows how to use the Stream dynamic parameter of the Remove-Item cmdlet to delete an alternate data stream. The stream parameter is introduced in Windows PowerShell 3.0.
The Stream parameter Get-Item gets the Zone.Identifier stream of the Copy-Script.ps1 file. Remove-Item uses the Stream parameter to remove the Zone.Identifier stream of the file. Finally, the Get-Item cmdlet shows that the Zone.Identifier stream was deleted.
Parameters
Prompts you for confirmation before running the cmdlet. For more information, see the following articles:
This parameter is not supported by any providers installed with PowerShell. To impersonate another user, or elevate your credentials when running this cmdlet, use Invoke-Command.
Type: | PSCredential |
Position: | Named |
Default value: | Current user |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Specifies, as a string array, an item or items that this cmdlet excludes in the operation. The value of this parameter qualifies the Path parameter. Enter a path element or pattern, such as *.txt . Wildcard characters are permitted. The Exclude parameter is effective only when the command includes the contents of an item, such as C:\Windows\* , where the wildcard character specifies the contents of the C:\Windows directory.
When using Recurse with Exclude, Exclude only filters results of the current directory. If there are files that match the Exclude pattern in subfolders, those files are removed along with its parent directory.
Type: | String [ ] |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | True |
Specifies a filter to qualify the Path parameter. The FileSystem provider is the only installed PowerShell provider that supports the use of filters. You can find the syntax for the FileSystem filter language in about_Wildcards. Filters are more efficient than other parameters, because the provider applies them when the cmdlet gets the objects rather than having PowerShell filter the objects after they are retrieved.
Type: | String |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | True |
Forces the cmdlet to remove items that cannot otherwise be changed, such as hidden or read-only files or read-only aliases or variables. The cmdlet cannot remove constant aliases or variables. Implementation varies from provider to provider. For more information, see about_Providers. Even using the Force parameter, the cmdlet cannot override security restrictions.
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Specifies, as a string array, an item or items that this cmdlet includes in the operation. The value of this parameter qualifies the Path parameter. Enter a path element or pattern, such as "*.txt" . Wildcard characters are permitted. The Include parameter is effective only when the command includes the contents of an item, such as C:\Windows\* , where the wildcard character specifies the contents of the C:\Windows directory.
Type: | String [ ] |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | True |
Specifies a path to one or more locations. The value of LiteralPath is used exactly as it is typed. No characters are interpreted as wildcards. If the path includes escape characters, enclose it in single quotation marks. Single quotation marks tell PowerShell not to interpret any characters as escape sequences.
Type: | String [ ] |
Aliases: | PSPath, LP |
Position: | Named |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Specifies a path of the items being removed. Wildcard characters are permitted.
Type: | String [ ] |
Position: | 0 |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | True |
Indicates that this cmdlet deletes the items in the specified locations and in all child items of the locations.
The Recurse parameter might not delete all subfolders or all child items. This is a known issue.
This behavior was fixed in Windows versions 1909 and newer.
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
This Parameter is only available on Windows.
The Stream parameter is a dynamic parameter that the FileSystem provider adds to Remove-Item . This parameter works only in file system drives.
You can use Remove-Item to delete an alternative data stream, such as Zone.Identifier . However, it is not the recommended way to eliminate security checks that block files that are downloaded from the Internet. If you verify that a downloaded file is safe, use the Unblock-File cmdlet.
This parameter was introduced in Windows PowerShell 3.0. As of Windows PowerShell 7.2, Remove-Item can remove alternative data streams from directories as well as files.
Type: | String [ ] |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | True |
Shows what would happen if the cmdlet runs. The cmdlet is not run.
Type: | SwitchParameter |
Aliases: | wi |
Position: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Inputs
You can pipe a string that contains a path, but not a literal path, to this cmdlet.
Outputs
None
This cmdlet does not return any output.
Notes
The Remove-Item cmdlet is designed to work with the data exposed by any provider. To list the providers available in your session, type Get-PsProvider . For more information, see about_Providers.
When you try to delete a folder that contains items without using the Recurse parameter, the cmdlet prompts for confirmation. Using -Confirm:$false does not suppress the prompt. This is by design.
Иногда надо сделать удаление файлов старше n дней. Например Backup’ ы. Можно делать это вручную, отсортировать их по дате и удалить, а можно воспользоваться скриптом. В данном примере мы рассмотрим скрипт для удаления файлов старше n дней и добавим задание в планировщик Windows Server 2012R2.
Содержание:
1. Скрипт удаления файлов старше n-дней
2. Создание задания в планировщике задач
Скрипт на самом деле очень простой, создается в PowerShell и выглядит он следующим образом:
Где:
F:\backup\ - путь, в какой папке мы будем с вами искать файлы для удаления *.* - имя (маска) файлов /d -30 - старше скольки дней нам необходимо удалить файлы.
Вот так это выглядит в PowerShell:
Осталось только его выполнить и все.
Все хорошо, у нас есть скрипт. Мы можем выполнять его вручную, когда необходимо очистить наши бекапы. Но зачем выполнять это вручную? Мы поручим планировщику запускать наш скрипт и избавимся сами от рутинной работы.
Итак, что нам для этого надо?
Для начала идем в "Пуск -> панель управления -> Администрирование" и запускаем там "Планировщик заданий".
Выбираем пункт "Создать задачу":
На вкладке "Общие" задаем имя задания, его описание и пользователя, от которого оно будет выполняться. По умолчанию там будет пользователь, под которым вы вошли в данный момент в систему.
Далее переходим на вкладку "Триггеры" и создаем расписание, когда мы будем запускать наше задания. У меня настроено в 10:00 каждые 2 дня.
Далее идем на вкладку "Действия" и задаем действие, которое будет выполняться. Выбираем "Запуск программы"
программу или сценарий
и указываем путь до PowerShell:
А аргументе указываем путь до нашего скрипта, который мы создали ранее:
Нажимаем "Ок" и еще раз "Ок"
Все, на этом наше задание создано. Осталось дождаться, когда будет выполнено наше действие по расписанию и проверить, все ли правильно было настроено.
Admin 25.05.2017 15:39
Странно. У меня все работает отлично на нескольких серверах. Попробуйте поставить галочку "Выполнить с наивысшими правами" А какой код ошибки при выполнении задачи? Можно посмотреть в журнале
Анонимус 25.07.2017 10:37
Все работает правильно на серверных системах , лично проверил. Проблемы были на win 10 Константин 31.10.2017 05:40
Здравствуйте А как сделать чтоб при удалении оставалось допустим последние 3 файла даже если они старше 30 дней?
Admin 01.11.2017 10:25
Самый простой вариант - Вам необходимо выставить в скрипте кол-во дней, которые будут подходить под Ваши файлы!
Мудрый Филин 06.02.2020 07:38
а как сделать так, что бы удалялись файлы каждый 10 минут? Как указать минуты? Александр 28.02.2020 10:28
У меня ругается вот так. forfiles.exe : ОШИБКА: Неправильный параметр или аргумент - &d&. DeleteFiles.ps1:1 знак:9 + CategoryInfo : NotSpecified: (ОШИБКА: Неправи. аргумент - &d&.:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError
Ваш покорный слуга - компьютерщик широкого профиля: системный администратор, вебмастер, интернет-маркетолог и много чего кто. Вместе с Вами, если Вы конечно не против, разовьем из обычного блога крутой технический комплекс.
Читайте также: