Búsqueda de sitios web

Cómo eliminar un archivo con PowerShell Remove-Item


Eliminar archivos y limpiar directorios puede ser una tarea que requiere mucho tiempo, especialmente cuando necesitas realizar la misma tarea en varias computadoras con regularidad. Pero con PowerShell, podemos crear pequeños scripts que eliminarán un archivo de forma rápida y eficaz mediante el cmdlet Remove-Item.

PowerShell nos permite no sólo eliminar un único archivo, sino incluso un directorio completo o un grupo de archivos según criterios específicos. ¿Y sabía que también es posible eliminar solo un archivo si existe, archivos que tengan más de x días o eliminar archivos según un patrón comodín?

En este artículo, veremos cómo eliminar un archivo en PowerShell. Y cómo utilizar las diferentes opciones para eliminar sólo archivos específicos, verificar la acción de eliminación y más.

Eliminar un archivo con PowerShell

Para eliminar archivos con PowerShell necesitamos usar el cmdlet Remove-Item. Este cmdlet puede eliminar uno o más elementos según los criterios. El cmdlet Remove-Item no solo se puede usar para eliminar archivos sino también para eliminar carpetas, claves de registro, variables, funciones y más. Nos centraremos en eliminar archivos en este artículo.

Con el cmdlet Remove-Item, podemos usar los siguientes parámetros:

-Path

Especifique la ruta de los elementos que deben eliminarse.

-LiteralPath

La ruta exacta del artículo.

-Include

Especifica un elemento de ruta para incluir, por ejemplo, *.txt

-Exclude

Especifica un elemento de ruta para excluir, por ejemplo, *.txt

-Recurse

Eliminar elementos en la ubicación especificada y en todas las subcarpetas

-Force

Se utiliza para eliminar archivos de solo lectura o elementos ocultos.

-Confirm

Solicitar confirmación

Entonces, para eliminar un solo archivo con PowerShell, solo necesitamos especificar la ruta completa al archivo, incluido el nombre del archivo. Por ejemplo, si queremos eliminar el archivo readme.txt de la siguiente carpeta podemos hacer:

Remove-Item -Path C:\temp\files\readme.txt

Tenga en cuenta que el cmdlet no pedirá confirmación, el archivo se eliminará instantáneamente. Entonces, cuando esté escribiendo su script de PowerShell que va a eliminar uno o más archivos, es importante probarlo primero. Podemos hacer esto usando el parámetro -confirm o -whatif. Confirmar le preguntará si desea eliminar el archivo o no, donde What if muestra qué haría el cmdlet sin eliminar realmente el elemento:

# 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".

Eliminar todos los archivos en una carpeta

Podemos usar el cmdlet Remove-Item en PowerShell también para eliminar todos los archivos de una carpeta. Ahora es importante tener en cuenta que el cmdlet también puede eliminar carpetas. Entonces, para eliminar solo los archivos, usaremos un comodín para seleccionar solo los elementos que incluyen un punto . en el nombre. De esta forma sólo se eliminan los archivos y no las subcarpetas:

# Remove all files from the path c:\temp\files
# Tip: test the results first with the -whatif parameter
Remove-Item -Path C:\temp\files\*.*

Otra opción es usar el cmdlet Get-ChildItem con el parámetro -File para obtener solo los archivos y luego canalizar el cmdlet Remove-Item a eliminar los archivos con PowerShell:

Get-ChildItem -Path C:\temp\files\ -File | Remove-Item

Eliminar archivos en carpetas y subcarpetas

Para eliminar archivos no solo en la carpeta sino también en la subcarpeta, necesitará usar el parámetro -Recurse. Solo hay un problema: no puedes usar la recombinación -Recurse con el método de selección de solo archivos *.*. Tome el siguiente ejemplo:

Remove-Item -Path C:\temp\files\*.* -Recurse

Probablemente espere que esto elimine sólo los archivos de la carpeta y subcarpeta. Sin embargo, al utilizar el comodín en la ruta, solo se seleccionan los elementos (archivos) que contienen . en el nombre de la ruta. Entonces el cmdlet no pasará por ninguna subcarpeta.

Para eliminar todos los archivos de la carpeta y todas las subcarpetas, tendremos que especificar solo la ruta de la carpeta principal y usar el parámetro -Include para seleccionar solo los archivos:

# Delete all files from the folder c:\temp\files and it's subfolders
Remove-Item -Path C:\temp\files\ -Recurse -Include *.*

Otra opción es obtener primero los archivos de la carpeta y subcarpeta con el cmdlet Get-ChildItem y luego eliminarlos:

Get-ChildItem -Path C:\temp\files\ -File -Recurse | Remove-Item

Eliminar archivos ocultos y de solo lectura

Los archivos ocultos y de sólo lectura están protegidos contra la eliminación de forma predeterminada. Echemos un vistazo al ejemplo siguiente, el archivo "la-srv-dc01.log" está marcado como de solo lectura y template.html es un archivo oculto.

Si intentamos eliminar todos los archivos de la carpeta, obtendrá un error en el archivo de solo lectura indicando que no tiene suficientes derechos de acceso para realizar esta operación. El archivo oculto ni siquiera se elimina.

Entonces, ¿cómo eliminamos esos archivos? Para eliminar también los archivos ocultos y de solo lectura necesitaremos usar el parámetro -Force:

# Remove all files, including read-only and hidden
Remove-Item -Path C:\temp\files\*.* -Force

PowerShell eliminar archivo si existe

Cuando se utiliza el cmdlet Remove-Item dentro de los scripts, es una buena idea probar si el archivo existe antes de intentar eliminarlo. Podemos hacer esto usando el cmdlet Test-Path. Esto comprobará si el archivo existe y devolverá verdadero o falso según el resultado. Al usar esto dentro de una declaración if, podemos asegurarnos de que el archivo solo se elimine si existe:

$file = C:\temp\files\readme.txt

if (Test-Path -Path $file) {
    Remove-Item -Path $file
}

Usar filtros para eliminar archivos en PowerShell

Ahora hemos analizado algunos de los principios para eliminar archivos con PowerShell. Pero además de simplemente eliminar un solo archivo o todos los archivos de la carpeta, a menudo encontrará situaciones en las que solo necesitará eliminar archivos con más de x días o archivos con un tipo de archivo específico.

Podemos utilizar una variedad de métodos para seleccionar solo esos archivos y eliminarlos con PowerShell. Cuando trabaje con filtros, asegúrese siempre de probar y verificar primero la selección, antes de eliminar los archivos.

Usando el filtro de inclusión

El parámetro Incluir nos permite seleccionar todos los archivos que tienen una cadena específica o parte de una cadena en su nombre de archivo. Por ejemplo, si solo desea eliminar los archivos .log de la carpeta, puede hacer:

# Remove all .log items
Remove-Item -Path C:\temp\files\ -Include *.log

El parámetro de inclusión no se limita a las extensiones de archivo, también puede seleccionar archivos según parte de su nombre. Y también es posible especificar varias "palabras clave" que desee seleccionar:

# 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".

Usando el filtro de exclusión

Siguiendo el principio del parámetro de inclusión, también podemos excluir archivos. Incluir y excluir se pueden usar juntos, por lo que podría, por ejemplo, eliminar todos los archivos de registro excepto los archivos de registro del proceso:

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".

Eliminar archivos de más de x días con PowerShell

Una práctica común al limpiar directorios es eliminar solo archivos que tengan más de x días. Para hacer esto, primero necesitaremos calcular la fecha del archivo. digamos que queremos eliminar todos los archivos que tienen más de 30 días, primero debemos obtener la fecha de hace 30 días:

# Get the date from today minus 30 days
$dateTime = (Get-Date).AddDays(-30)

El siguiente paso es obtener todos los archivos que sean anteriores a la fecha indicada. Para ello vamos a comparar el lastwritetime del archivo con el datetime que calculamos:

Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.LastWriteTime -lt $dateTime }

Luego solo tenemos que canalizar el cmdlet Remove-Item detrás de él para eliminar los archivos:

$dateTime = (Get-Date).AddDays(-30)
$path = "C:\temp\files\"

Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.LastWriteTime -lt $dateTime } | Remove-Item

Eliminar archivos mayores que

Para eliminar todos los archivos que superan un tamaño determinado, primero necesitaremos convertir el tamaño del archivo de Mb a kbits. Con el tamaño correcto, podemos seleccionar todos los archivos que sean más grandes que el tamaño dado y eliminarlos con el cmdlet 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

Concluyendo

PowerShell es una gran herramienta cuando se trata de administrar y eliminar archivos automáticamente. Puede escribir scripts que limpien archivos antiguos cada semana para buscar y eliminar rápidamente archivos grandes de la carpeta determinada.

Tenga en cuenta que los archivos se eliminan permanentemente, así que asegúrese de probar sus comandos primero usando el parámetro antes de eliminar los archivos.

Espero que este artículo te haya resultado útil. Si tienes alguna pregunta, deja un comentario a continuación.

Artículos relacionados