Как удалить файл с помощью PowerShell Remove-Item
Удаление файлов и очистка каталогов могут занять много времени, особенно когда вам нужно регулярно выполнять одну и ту же задачу на нескольких компьютерах. Но с помощью PowerShell мы можем создать небольшие скрипты, которые будут быстро и эффективно удалять файл с использованием команды Remove-Item.
PowerShell позволяет нам не только удалять отдельный файл, но и целую директорию или группу файлов на основе определённых критериев. А вы знали, что также возможно удалять файл только если он существует, файлы, которые старше x дней, или удалять файлы на основе шаблона подстановки?
В этой статье мы рассмотрим, как удалить файл в PowerShell. А также как использовать различные параметры для удаления только определенных файлов, подтверждать действие удаления и многое другое.
Удалите файл с помощью PowerShell
Чтобы удалить файлы с помощью PowerShell, необходимо использовать командлет Remove-Item. Этот командлет может удалить один или несколько элементов в зависимости от заданных критериев. Командлет Remove-Item может использоваться не только для удаления файлов, но и для удаления папок, ключей реестра, переменных, функций и многого другого. В этой статье мы сосредоточимся на удалении файлов.
С помощью команды Remove-Item мы можем использовать следующие параметры:
| Параметр | Описание |
|---|---|
| -Path | Укажите путь к элементам, которые необходимо удалить. |
| -LiteralPath | Точный путь предмета |
| -Include | Указывает элемент пути для включения, например, *.txt |
| -Exclude | Указывает элемент пути для исключения, например, *.txt |
| -Recurse | Удалить элементы в указанном месте и во всех подпапках |
| -Force | Используется для удаления файлов только для чтения или скрытых элементов |
| -Confirm | Запрос на подтверждение |
Итак, чтобы удалить один файл с помощью PowerShell, нам необходимо указать полный путь к файлу, включая имя файла. Например, если мы хотим удалить файл readme.txt из папки ниже, мы можем сделать это:
Remove-Item -Path C:\temp\files\readme.txtОбратите внимание, что cmdlet не запросит подтверждение, файл будет удалён мгновенно. Поэтому, когда вы пишете свой скрипт PowerShell, который собирается удалить один или несколько файлов, важно сначала протестировать его. Мы можем сделать это, используя либо параметр -confirm, либо -whatif. Confirm предложит вам подтвердить, хотите ли вы удалить файл, тогда как what if покажет, что cmdlet сделал бы, не удаляя элемент на самом деле:
Using Confirm
Remove-Item -Path C:\temp\files\readme.txt -Confirm
Confirm
Are you sure you want to perform this action?
Performing the operation "Remove File" on target "C:\temp\files\readme.txt".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
Or using WhatIf
Remove-Item -Path C:\temp\files\readme.txt -whatif
What if: Performing the operation "Remove File" on target "C:\temp\files\readme.txt".Удалить все файлы в папке
Мы также можем использовать командлет Remove-Item в PowerShell для удаления всех файлов в папке. Важно отметить, что этот командлет также может удалять папки. Поэтому для того, чтобы удалить только файлы, мы будем использовать подстановочный знак, чтобы выбрать только элементы, которые содержат точку . в имени. Таким образом будут удалены только файлы, а не подкаталоги:
Remove all files from the path c:\temp\files
Tip: test the results first with the -whatif parameter
Remove-Item -Path C:\temp\files\*.*Другим вариантом является использование командлета Get-ChildItem с параметром -File, чтобы получить только файлы, а затем передать командлет Remove-Item для удаления файлов с помощью PowerShell:
Get-ChildItem -Path C:\temp\files\ -File | Remove-ItemУдалить файлы в папке и подпапках
Чтобы удалить файлы не только в папке, но и в подпапках, вам нужно использовать параметр -Recurse. Есть только одна проблема, вы не можете использовать сочетание -Recurse с методом выбора только файлов *.*. Приведем пример ниже:
Remove-Item -Path C:\temp\files\*.* -RecurseВы, вероятно, ожидаете, что это удалит только файлы в папке и подпапке. Однако, используя подстановочный знак в пути, выбираются только элементы (файлы), которые содержат . в имени пути. Таким образом, командлет не будет проходить через какие-либо подпапки.
Чтобы удалить все файлы в папке и всех ее подпапках, нам нужно указать только путь к родительской папке и использовать параметр -Include, чтобы выбрать только файлы:
Delete all files from the folder c:\temp\files and it's subfolders
Remove-Item -Path C:\temp\files\ -Recurse -Include *.*Другой вариант - сначала получить файлы из папки и подпапки с помощью команды Get-ChildItem, а затем удалить их:
Get-ChildItem -Path C:\temp\files\ -File -Recurse | Remove-ItemУдалить файлы только для чтения и скрытые файлы
Файлы только для чтения и скрытые файлы защищены от удаления по умолчанию. Давайте взглянем на пример ниже: файл "la-srv-dc01.log" помечен как только для чтения, а template.html является скрытым файлом.
Если мы попытаемся удалить все файлы в папке, то вы получите ошибку о файле только для чтения, и у вас недостаточно прав доступа для выполнения этой операции. Скрытый файл даже не будет удален вообще.
Итак, как мы можем удалить эти файлы? Чтобы также удалить файлы только для чтения и скрытые файлы, нам нужно использовать параметр -Force:
Remove all files, including read-only and hidden
Remove-Item -Path C:\temp\files\*.* -ForcePowerShell удаляет файл, если он существует
При использовании команды Remove-Item внутри скриптов, хорошей идеей является проверка существования файла перед попыткой его удалить. Мы можем сделать это, используя команду Test-Path. Это проверит, существует ли файл, и вернет true или false в зависимости от результата. Используя это в условном операторе, мы можем убедиться, что файл будет удален только в том случае, если он существует:
$file = C:\temp\files\readme.txt
if (Test-Path -Path $file) {
Remove-Item -Path $file
}Использование фильтров для удаления файлов в PowerShell
Теперь мы рассмотрели некоторые принципы удаления файлов с помощью PowerShell. Но помимо простого удаления одного файла или всех файлов в папке, вы часто столкнетесь с ситуациями, когда необходимо удалить только файлы старше x дней или файлы с определенным типом.
Мы можем использовать различные методы для выбора только тех файлов и их удаления с помощью PowerShell. При работе с фильтрами всегда убедитесь, что вы сначала протестировали и проверили выбор, прежде чем реально удалить файлы.
Использование фильтра включения
Параметр Include позволяет нам выбрать все файлы, которые имеют конкретную строку или часть строки в своем имени файла. Например, если вы хотите удалить только файлы .log из папки, вы можете сделать это:
Remove all .log items
Remove-Item -Path C:\temp\files\ -Include *.logПараметр include не ограничивается только расширениями файлов, вы также можете выбирать файлы на основе части их имени. Также возможно указать несколько "ключевых слов", которые вы хотите выбрать:
Get all files that have the word app or process in their name.
Remove-Item -Path C:\temp\files\ -Include *app*, *process* -Recurse -WhatIf
Result
What if: Performing the operation "Remove File" on target "C:\temp\files\subfolder\LT3452-process-errors.log".
What if: Performing the operation "Remove File" on target "C:\temp\files\subfolder\LT3452-process.log".
What if: Performing the operation "Remove File" on target "C:\temp\files\11032021-app.log".
What if: Performing the operation "Remove File" on target "C:\temp\files\11032022-app.log".
Используя фильтр исключения
Следуя принципу параметра include, мы также можем исключать файлы. Параметры include и exclude могут использоваться вместе, поэтому вы можете, например, удалить все журнальные файлы, кроме файлов журнала процессов:
Remove-Item -Path C:\temp\files\ -Include *.log -Exclude *process* -Recurse -WhatIf
Result
What if: Performing the operation "Remove File" on target "C:\temp\files\11032021-app.log".
What if: Performing the operation "Remove File" on target "C:\temp\files\11032022-app.log".
What if: Performing the operation "Remove File" on target "C:\temp\files\la-srv-dc01.log".Удалить файлы старше x дней с помощью PowerShell
Распространенной практикой при очистке каталогов является удаление только файлов, которые старше x дней. Для этого нам сначала нужно рассчитать дату файла. Допустим, мы хотим удалить все файлы, которые старше 30 дней, тогда сначала нам нужно получить дату, которая была 30 дней назад:
Get the date from today minus 30 days
$dateTime = (Get-Date).AddDays(-30)
Следующим шагом является получение всех файлов, которые старше заданной даты. Для этого мы будем сравнивать lastwritetime файла с datetime, который мы рассчитали:
Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.LastWriteTime -lt $dateTime }Затем нам просто нужно подключить командлет Remove-Item для фактического удаления файлов:
$dateTime = (Get-Date).AddDays(-30)
$path = "C:\temp\files\"
Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.LastWriteTime -lt $dateTime } | Remove-ItemУдалить файлы больше чем
Чтобы удалить все файлы, которые больше заданного размера, сначала нужно преобразовать размер файла из Мбайт в килобиты. С правильным размером мы сможем выбрать все файлы, которые больше заданного размера, и удалить их с помощью команды Remove-Item:
$path = "C:\temp\files\"
Set file size
$sizeInMb = 500
Calculate actual file size
$size = $sizeInMb*1024*1024
Delete all files that are larger then given size
Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.length -gt $size } | Remove-ItemЗаключение
PowerShell - это отличный инструмент для автоматического управления и удаления файлов. Вы можете писать скрипты, которые будут очищать старые файлы каждую неделю, чтобы быстро находить и удалять большие файлы из заданной папки.
Имейте в виду, что файлы удаляются навсегда, поэтому убедитесь, что вы сначала протестировали ваши команды с помощью параметра , прежде чем фактически удалять файлы.
Надеюсь, вы нашли эту статью полезной. Если у вас есть вопросы, просто оставьте комментарий ниже.

