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 ?









