Búsqueda de sitios web

Copiar elemento y eliminar elemento: automatice las operaciones de copia y eliminación


Puede suceder que los archivos deban eliminarse periódicamente o copiarse en otro lugar. Esto no es un problema en sí mismo, siempre y cuando sepas un poco sobre secuencias de comandos. Pero muchas personas no llegan tan lejos, simplemente compran el siguiente producto, con suerte no Total Commander, sino “Super Copy”. La barra de herramientas Ask se instalará al mismo tiempo. Más adelante, se discute mucho sobre las vulnerabilidades de Windows. Fuera la ironía.

PowerShell ofrece cmdlets de elementos completos. Yo los llamo la familia de artículos.


Get-Command -Noun Item

En este artículo me gustaría centrarme en dos cmdlets: Copiar elemento y Eliminar elemento.

Copiar elemento

El siguiente comando copia un archivo C:\Temp\pwd.txt a C:\Temp1\.


Copy-Item -Path C:\Temp\pwd.txt -Destination C:\Temp1\ -Verbose

El parámetro detallado se puede omitir. Sólo está ahí para mostrar lo que sucede.

Copiar carpeta y subcarpetas

¿Qué pasa con copiar todo el contenido del directorio, incluidos los subdirectorios? Para esto, use el parámetro Recurse.


Copy-Item -Path C:\Temp\ -Destination C:\Temp1\ -Recurse -Verbose

Copiar solo archivos

Para copiar solo archivos sin la carpeta y la estructura de carpetas, se me ocurren 2 ejemplos.

Usar Get-ChildItem con el parámetro Archivo y enviar todos los archivos a través de la tubería a Copy-Item.


Get-ChildItem C:\Temp\ -File -Recurse | Copy-Item -Destination C:\Tempnew\

O usar Where-Object y especificar que las carpetas, es decir, contenedores, no deben copiarse.


Get-ChildItem "C:\Temp\*" -Force -Recurse | Where-Object { -not $_.PSIsContainer } | Copy-Item -Destination C:\Tempnew\ -Verbose

Copiar archivos de un tipo de archivo específico

Digamos que queremos copiar solo archivos de texto, es decir, todos los archivos con extensión de archivo txt. Para ello, podemos utilizar el parámetro de filtro, que se incluye en el cmdlet Copy-Item.

El siguiente comando copia todos los archivos de texto, pero no la carpeta en sí. Tenga en cuenta el asterisco * después del nombre de la carpeta y el filtro.


Copy-Item -Path C:\temp\* -Destination C:\Temptxt -Filter '*.txt'

Copiar en sesiones remotas

¿Conoce las conexiones remotas de PowerShell? Enter-PSSession y New-PSSession son tus amigos cuando se trata de comunicación remota. Dos ejemplos míos:

Copiar todas las carpetas y archivos de C:\Temp en dc01 a C:\Temp en client01. Tenga en cuenta que he iniciado sesión en dc01. La administración remota en client01 está habilitada (winrm qc).


Copy-Item -Path C:\Temp\ -Destination C:\ -ToSession (New-PSSession -ComputerName Client01) -Recurse

Para volver a copiar todos esos archivos, utilice el parámetro FromSession.


Copy-Item -Path C:\Temp\ -Destination C:\ -FromSession (New-PSSession -ComputerName Client01) -Recurse

Más sobre Copiar-Artículo aquí:

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/copy-item?view=powershell-6

Remover el artículo

El cmdlet Remove-Item le permite eliminar elementos, lo que significa no solo archivos, sino también todos los demás elementos. ¡En PowerShell todo es un elemento y un objeto!


Remove-Item -Path C:\Temp\hotfixes.htm -Verbose

Para mostrarle cómo eliminar entradas del registro, solo quiero tomar el ejemplo de la Ayuda para eliminar elementos. Este comando elimina las claves de registro de OldApp.


Remove-Item hklm:\software\mycompany\OldApp -Recurse

Para eliminar solo archivos txt en una carpeta y sus subcarpetas, ejecute


Remove-Item -Include *.txt -Recurse -Path C:\Temp1\ -Verbose

Automatizar copiar y eliminar trabajos

Ahora vayamos al grano. Como dice el titular, quiero mostrarte cómo automatizar todo esto. Supongamos que tenemos el siguiente escenario.

  • Todos los archivos de una carpeta y su subcarpeta se copiarán como copia de seguridad en una carpeta de destino.
  • Luego se deben eliminar los archivos de la carpeta de origen. Debemos tener cuidado de que la estructura de carpetas de la carpeta de origen permanezca intacta, eso significa que no debemos eliminar la estructura de carpetas.
  • El trabajo debe realizarse todos los sábados a las 11:00 a.m.

Este comando copia todos los archivos de C:\Original y sus subcarpetas a C:\Destination.


Copy-Item -Path C:\Original\* -Destination C:\Destination\ -Recurse -Force

Y este comando elimina todos los archivos en C:\Original.


Get-ChildItem -Path C:\Original\ -Include *.* -Recurse | Remove-Item -Force

¿Por qué no Eliminar-Artículo -Incluir *.* -Recurse? Bueno, descubrí que hay algunos problemas al combinar filtros y recursividad:

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/remove-item?view=powershell-6

Volver al tema. Ahora guardo el archivo como C: \Temp\OrigDest.ps1. Es hora de crear una tarea programada que se ejecute todos los sábados a las 11:00 a. m.


$Action=New-ScheduledTaskAction -Execute 'powershell' -Argument 'C:\Temp\OrigDest.ps1'
$Trigger=New-ScheduledTaskTrigger -Weekly -DaysOfWeek Saturday -At 11am
$Set=New-ScheduledTaskSettingsSet
$Principal=New-ScheduledTaskPrincipal -UserId 'sid-500\administrator' -LogonType S4U
$Task=New-ScheduledTask -Action $Action -Trigger $Trigger -Settings $Set -Principal $Principal
Register-ScheduledTask -TaskName "Copy Orig to Dest" -InputObject $Task -Force

Eso es todo. Automatización completada ?

Artículos relacionados