Поиск по сайту:

Как удалить файл с помощью 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\*.* -Force

PowerShell удаляет файл, если он существует

При использовании команды 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 - это отличный инструмент для автоматического управления и удаления файлов. Вы можете писать скрипты, которые будут очищать старые файлы каждую неделю, чтобы быстро находить и удалять большие файлы из заданной папки.

Имейте в виду, что файлы удаляются навсегда, поэтому убедитесь, что вы сначала протестировали ваши команды с помощью параметра , прежде чем фактически удалять файлы.

Надеюсь, вы нашли эту статью полезной. Если у вас есть вопросы, просто оставьте комментарий ниже.