Usando el Cmdlet Copy-Item de PowerShell para copiar archivos
Sep 16, 2024
¿Qué es el Cmdlet Copy-Item de PowerShell?
El cmdlet Copy-Item en Powershell se utiliza principalmente para copiar archivos desde el origen hasta el destino. En términos de cantidad de archivos, pueden ser individuales o múltiples junto con su contenido. También puede funcionar en diferentes sistemas de archivos como locales, recursos compartidos de red, etc.
Sintaxis básica y parámetros
La sintaxis básica para el cmdlet Copy-Item de PowerShell es la siguiente:
Copy-Item -Path <source> -Destination <destination> [<parameters>]
Si escribe solo el cmdlet, PowerShell le solicitará la Fuente, como se muestra a continuación:
El primer parámetro obligatorio es la ruta de origen. Este parámetro de ruta del elemento especifica la ruta al elemento o elementos que se van a copiar. La fuente puede ser una ruta de archivo o carpeta. Se pueden especificar múltiples rutas utilizando una lista separada por comas, y la ruta puede contener comodines. Una buena práctica sería proporcionar una cadena de ruta de destino para especificar la ruta a la cual se deben copiar los elementos. Si se copia un solo elemento, la ruta puede incluir un nuevo nombre para el elemento copiado si se desea.
A continuación se muestra una lista de otros parámetros para el cmdlet de PowerShell Copy-Item:
- -Recurse: Copia subdirectorios y su contenido de manera recursiva, lo que significa que el cmdlet Copy-Item se aplica a la carpeta de nivel superior y todos los niveles de subcarpetas debajo de ella.
- -Force parameter: Sobrescribe archivos existentes de solo lectura y crea directorios de destino si no existen.
- -Container: Preserva los objetos contenedor durante las operaciones de copia, lo cual es útil al copiar estructuras de directorios.
- -Filter: Especifica una cadena de filtro para calificar el parámetro de ruta, como especificar una extensión de archivo particular
- -Include: Especifica los elementos a copiar y admite comodines. Solo se copian los elementos que coinciden con los parámetros Path e Include
- -Exclude: Especifica elementos a omitir al copiar, soporta comodines
- -Credential: Specifies the user account credentials to use for the operation
- -WhatIf: Muestra lo que sucedería si el comando se ejecutara sin llevarlo a cabo realmente
- -Confirm: Solicita confirmación antes de ejecutar el comando
- -FromSession: Especifica el objeto PSSession del cual obtener un archivo remoto.
- -ToSession: Especifica el objeto PSSession al cual enviar un archivo de manera remota
Contenido relacionado seleccionado:
Casos de uso comunes
Para la mayoría de los ejemplos, copiaremos archivos a múltiples ubicaciones en el ordenador local. Sin embargo, existen una variedad de casos de uso comunes para el cmdlet Copy-Item, que incluyen:
- Creando copias de seguridad de archivos y carpetas importantes
- Distribuyendo archivos o aplicaciones sencillas a través de múltiples máquinas
- Migrando grandes cantidades de archivos entre servidores o ubicaciones de almacenamiento
- Los desarrolladores pueden crear instantáneas de las carpetas del proyecto en diferentes etapas del desarrollo.
- Distribuir archivos de configuración a través de múltiples servidores
Ahora comparemos el cmdlet Copy-Item con otros cmdlets de gestión de archivos:
Copy-Item vs. Move-Item:
- Copy-Item crea un duplicado, dejando el original intacto
- Move-Item traslada el archivo/carpeta, eliminándolo de la ubicación original
Copy-Item vs. Get-ChildItem
- Copy-Item realiza la acción de copiar
- Get-ChildItem enumera archivos y carpetas y se utiliza a menudo en conjunto con Copy-Item
Tenga en cuenta que se recomienda el cmdlet Copy-Item para la copia básica de archivos. Aquellos que buscan características más avanzadas para transferencias de archivos grandes o espejado pueden considerar Microsoft Robocopy.
Copiando archivos con el cmdlet Copy-Item de PowerShell
Ejemplo básico de copia de archivos
En este ejemplo, queremos copiar una hoja de cálculo de una carpeta a otra utilizando el comando de PowerShell copy item.
Copy-Item -Path "C:\Destination One\SpreadsheetOne.xlsx" -Destination "c:\Destination Two"
Así es como se ve en PowerShell:
Copiando múltiples archivos
Ahora, copiemos más de un archivo a la vez. Observa que las rutas de los archivos utilizan diferentes unidades. Recuerda que si el directorio de destino no existe, PowerShell lo creará.
Copy-Item -Path "C:\source\file1.txt","C:\Source\file2.txt" -Destination "D:\Destination Two"
Copiando archivos con cambio de nombre
Puede copiar un archivo a una nueva carpeta y renombrarlo en el proceso utilizando el siguiente comando:
Copy-Item -Path "C:\Source\file1.txt" -Destination "C:\Destination Two\NewName1.txt"
Así es como se ve en PowerShell:
Copiando carpetas con PowerShell
La capacidad de copia de PowerShell no se limita solo a archivos – también puedes copiar una carpeta usando el cmdlet Copy-Item a nuevas ubicaciones. A continuación, te mostramos cómo utilizar el comando de PowerShell para copiar una carpeta y su contenido.
Ejemplo básico de copia de carpeta
Utilice el comando de PowerShell para copiar carpetas que se muestra a continuación para copiar una carpeta a una ubicación diferente. Este comando de copia de PowerShell copiará todos los archivos en la carpeta “source” y los colocará en la carpeta de destino.
Copy-Item -Path "C:\source\folder" -Destination "D:\destination"
Copiando carpetas con subcarpetas
¿Qué pasaría si la carpeta de origen tuviera múltiples subdirectorios dentro de ella? Utilizando el comando básico anterior, cualquier cosa dentro de los subdirectorios habría sido ignorada. Si quieres copiar todo en la carpeta de origen, incluyendo el contenido de los subdirectorios, necesitas ejecutar un comando de copia de carpeta y subcarpetas de PowerShell utilizando el parámetro Recurse.
Copy-Item -Path "C:\source\folder" -Destination "D:\destination" -Recurse
Contenido relacionado seleccionado:
Copiando y fusionando múltiples carpetas
Supongamos que quieres copiar los archivos de dos carpetas de origen y fusionarlos en una sola carpeta de destino. Eso se logra fácilmente utilizando el comando de PowerShell para copiar el contenido de una carpeta a otra. Aquí, dos rutas de origen están separadas por una coma. Se copian y luego se fusionan en la carpeta de destino.
Copy-Item -Path "C:\source1\*","C:\source2\*" -Destination "D:\destination"
Técnicas avanzadas de copia de archivos y carpetas
Uso de comodines en rutas de archivos
Los comodines permiten copiar múltiples archivos o carpetas que coinciden con un patrón específico sin tener que enumerar cada elemento individualmente. Son ideales para tratar con un gran número de archivos o carpetas, ya que el uso de comodines puede reducir significativamente la cantidad de código necesario. En el ejemplo a continuación, el comodín se utiliza para cualquier archivo .txt:
Copy-Item -Path "C:\source\*.txt" -Destination "C:\Destination Two"
Así es como se ve en PowerShell:
Filtrando archivos con parámetros de inclusión y exclusión
Habrá ocasiones en las que querrás excluir archivos específicos dentro de una carpeta para copiar. Puede que quieras excluir o solo incluir ciertos tipos de archivos o versiones de archivos, o no incluir archivos específicos que contengan información sensible. Como tal, probablemente querrás excluir archivos temporales o innecesarios durante un proceso de respaldo o migración.
En el siguiente ejemplo, estamos copiando y especificando que todos los archivos de registro deben ser considerados para la copia; sin embargo, cualquier archivo de registro que también tenga una extensión .tmp será excluido.
Copy-Item -Path "C:\source\*" -Destination "D:\destination" -Include "*.log" -Exclude "*.tmp"
Usando el parámetro Force para sobrescribir archivos
De forma predeterminada, Copy-Item sobrescribirá los archivos existentes en el destino sin solicitar confirmación. A veces, puedes encontrarte con una situación en la que la carpeta de destino contiene un archivo de solo lectura con el mismo nombre que el archivo que estás intentando copiar. De forma predeterminada, Copy-Item no sobrescribirá este archivo de solo lectura. Sin embargo, puedes anular este comportamiento y forzar la sobrescritura utilizando el parámetro -Force. Aquí tienes un ejemplo de cómo usarlo:
Copy-Item -Path "C:\source\file.txt" -Destination "D:\destination" -Force
Copiando archivos y carpetas a computadoras remotas mediante Copy-Item
Aunque hay situaciones en las que podrías necesitar copiar archivos y carpetas a diferentes ubicaciones de unidad en una computadora local, la verdadera fortaleza del cmdlet Copy-Item radica en su capacidad para facilitar la transferencia de archivos y carpetas entre computadoras remotas.
Configuración de una sesión remota con New-PSSession
Digamos que quieres copiar algunos archivos a una computadora remota usando PowerShell. Aunque puedas tener derechos de administrador local, tu cuenta actual puede no tener los derechos adecuados para la computadora de destino. También tendrás que conocer el computername de la máquina remota. En este caso, debes establecer una sesión remota con la nueva computadora usando una credencial alternativa. Puedes llevar a cabo el comando de PowerShell para copiar archivos a una carpeta usando el comando $session a continuación.
$session = New-PSSession -ComputerName "RemotePC" -Credential "User"
Copiando archivos a un ordenador remoto
Ahora puede copiar archivos al ordenador remoto utilizando la sesión establecida.
Copy-Item -Path "C:\source\file.txt" -Destination "C:\remote\destination" -ToSession $session
Copiando archivos de un ordenador remoto
Por supuesto, es posible que quieras copiar archivos de una computadora remota a tu computadora local. Para hacer esto, utiliza el siguiente comando.
Copy-Item -Path "C:\remote\source\file.txt" -Destination "C:\local\destination" -FromSession $session
Copiando carpetas remotas de manera recursiva
En los ejemplos anteriores que involucraban computadoras remotas, las subcarpetas y sus contenidos no se incluían en la operación de copia. Para incluir todo el contenido de la ruta del elemento de origen, incluyendo todas las subcarpetas y archivos, añada el parámetro -Recurse al comando Copy-Item, tal como lo hicimos con las operaciones de copia locales.
Copy-Item -Path "C:\remote\source\folder" -Destination "C:\local\destination" -FromSession $session -Recurse
Contenido relacionado seleccionado:
Manejo de Errores y Verificación
Usando los parámetros WhatIf y Confirm
El parámetro WhatIf le permite verificar el resultado de un comando sin realizar ningún cambio. Por ejemplo, como se muestra a continuación, es posible que desee confirmar que las rutas de origen y destino son correctas antes de ejecutar la operación de copia.
También puede verificar el comportamiento de sobreescritura, que muestra qué archivos se sobrescribirán en el destino, ayudándole a evitar la pérdida de datos no intencionada. WhatIf le ayuda a entender exactamente qué elementos serán copiados. El parámetro del comando se muestra a continuación.
Copy-Item -Path "C:\Source\File1.txt" -Destination "C:\Destination Two" -WhatIf
Por defecto, la mayoría de los cmdlets de PowerShell realizan cambios en el sistema sin confirmación del usuario. Puede haber casos en los que desee que el usuario confirme una acción si se ejecuta. El mejor ejemplo sería si usara PowerShell para eliminar un archivo. En el ejemplo a continuación, utiliza el comando confirm para solicitar la confirmación del usuario.
Remove-Item -Path C:\file.txt -Confirm
El comando se ejecutará en PowerShell, como se muestra a continuación:
Puedes agregar el parámetro -Confirm a cualquier comando Copy-Item.
Verificando el proceso de copia
Cuando utilices PowerShell para respaldar archivos críticos, es posible que quieras verificar que el proceso de copia haya ocurrido. Puedes crear un script de PowerShell sencillo, como el que se muestra a continuación, para confirmar la copia de archivos comparando la cantidad de archivos, tamaños y marcas de tiempo.
# Define source and destination paths
$source = "C:\SourceFolder"
$destination = "C:\DestinationFolder"
# Copy the files from source to destination
Copy-Item -Path $source\* -Destination $destination -Recurse
# Confirm the files were copied by checking if they exist in the destination folder
$sourceFiles = Get-ChildItem -Path $source
$allCopied = $true
foreach ($file in $sourceFiles) {
$destinationFile = Join-Path $destination $file.Name
if (Test-Path $destinationFile) {
Write-Host "File '$($file.Name)' was copied successfully."
} else {
Write-Host "File '$($file.Name)' failed to copy."
$allCopied = $false
}
}
if ($allCopied) {
Write-Host "All files copied successfully."
} else {
Write-Host "Some files failed to copy."
}
Manejo de errores y reintentos
Es posible que desee utilizar el manejo de errores para la copia de archivos grandes para asegurarse de que sus scripts funcionen correctamente y puedan recuperarse de fallos inesperados. En PowerShell, la forma principal de manejar errores es a través de bloques try-catch. El script a continuación utiliza el try-catch para manejar errores al copiar archivos
# Define source and destination paths
$source = "C:\SourceFolder"
$destination = "C:\DestinationFolder"
# Function to copy files with error handling
function Copy-Files {
try {
# Copy files and set error action to stop failure
Copy-Item -Path $source\* -Destination $destination -Recurse -ErrorAction Stop
Write-Host "Files copied successfully."
}
catch {
# Log the error message
Write-Error "An error occurred while copying files: $($_.Exception.Message)"
# Perform additional actions, like retrying or logging
}
finally {
Write-Host "Copy operation complete."
}
}
# Execute the function
Copy-Files
Ejemplos prácticos y casos de uso del cmdlet Copy-Item
Ejemplos detallados de tareas comunes
- Copia de archivos de un disco duro con fallos: Un disco duro muestra signos de fallo y es necesario copiar los archivos críticos a un lugar seguro antes de que el disco falle.
- Automatización de copias de seguridad para cambios diarios de archivos: Para la recuperación de desastres, una empresa podría necesitar hacer copias de seguridad de todos los archivos en un directorio crítico en un servidor de respaldo.
- Migración de un Servidor Local a Almacenamiento en la Nube: Una empresa podría querer migrar los documentos de su servidor local desde unidades locales a un proveedor de almacenamiento en la nube como Azure o AWS.
- Desplegando Archivos de Configuración en Múltiples Servidores: Un administrador de sistemas desea desplegar archivos de configuración actualizados desde
C:\ConfigUpdatesa una lista de servidores remotos.
Escenarios y soluciones del mundo real
Una estructura de archivos compleja puede presentar algunos casos desafiantes al usar el cmdlet Copy-Item. Por ejemplo, las rutas de archivo largas pueden ser un problema para versiones antiguas de Windows que no admiten rutas de archivo de más de 260 caracteres. En esos casos, es posible que desee usar rutas UNC en lugar de rutas de archivo locales.
Puede haber casos en los que necesites usar el parámetro -LiteralPath en el cmdlet Copy-Item. Esto podría ser necesario cuando la ruta contiene caracteres especiales (como [, ], o *) que PowerShell podría interpretar de otra manera como caracteres comodín o secuencias de escape.
Los problemas de permisos también son un problema común. Puede usar el parámetro -Force para anular algunas restricciones o ejecutar PowerShell como administrador.
Contenido relacionado seleccionado:
Scripts de muestra para automatización
Es de su interés automatizar tantas tareas manuales como sea posible para agilizarlas y evitar errores humanos. A continuación se muestra un ejemplo de un script de PowerShell que se utiliza para hacer una copia de seguridad de una carpeta en un directorio de respaldo.
# Define source and destination directories
$sourcePath = "C:\SourceDirectory"
$backupPath = "D:\BackupDirectory"
# Get current timestamp to append to the backup folder
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
# Create a new folder for the current backup with timestamp
$backupDestination = "$backupPath\Backup_$timestamp"
New-Item -ItemType Directory -Path $backupDestination
# Copy all files and directories from the source to the backup folder
try {
Copy-Item -Path $sourcePath -Destination $backupDestination -Recurse -Force
Write-Output "Backup completed successfully on $(Get-Date)"
} catch {
Write-Output "An error occurred during the backup: $_"
}
# Optional: Clean up old backups (e.g., delete backups older than 30 days)
$daysToKeep = 30
$oldBackups = Get-ChildItem -Path $backupPath -Directory | Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-$daysToKeep) }
foreach ($backup in $oldBackups) {
try {
Remove-Item -Path $backup.FullName -Recurse -Force
Write-Output "Old backup removed: $($backup.FullName)"
} catch {
Write-Output "An error occurred while deleting old backups: $_"
}
}
Consejos y mejores prácticas
Mejores prácticas para usar Copy-Item
Aunque el cmdlet Copy-Item es sencillo, aquí hay algunas mejores prácticas que podrían ayudarte en circunstancias más complejas.
- Ejecutar PowerShell como Administrador
- Utilice el parámetro -Recurse para copiar estructuras de directorios completas.
- Utilice el parámetro -Force con prudencia para evitar sobrescrituras no deseadas
- Al copiar directorios grandes, considere alternativas como Robocopy u otras herramientas más adecuadas para trabajos de gran envergadura.
- Considere usar -WhatIf para probar sus comandos y ver qué podría suceder sin realizar cambios reales.
Errores comunes y cómo evitarlos
Además de las mejores prácticas, también debe tener en cuenta estas trampas comunes al usar scripts de PowerShell:
- Evite usar rutas incorrectas o relativas que no se resuelvan como se espera utilizando rutas completas
- Es fácil olvidar los subdirectorios subyacentes, así que usa el parámetro -Recurse para asegurarte de que todos los archivos contenidos en el directorio padre sean copiados.
- Los permisos insuficientes impedirán que completes las operaciones de copia, especialmente cuando se involucren máquinas remotas. Asegúrate de tener los permisos adecuados y utiliza privilegios elevados cuando sea necesario.
- Cuando las operaciones de copia complejas no se completan correctamente, utilice bloques try-catch e implemente un registro de errores adecuado.
Consideraciones y optimizaciones de rendimiento
Copiar conjuntos de datos sustanciales puede consumir mucha potencia de procesamiento en su computadora. El procesamiento paralelo es una técnica de computación que implica dividir una tarea en partes más pequeñas y ejecutarlas simultáneamente en múltiples procesadores o núcleos. El procesamiento paralelo puede mejorar significativamente el rendimiento cuando se aplica a operaciones de archivos como las realizadas por el cmdlet Copy-Item. En lugar de copiar archivos uno a uno secuencialmente, el procesamiento paralelo permite que varios archivos se copien de manera concurrente, utilizando la capacidad total de los procesadores multi-núcleo modernos. Este enfoque puede reducir drásticamente el tiempo requerido para operaciones de copia grandes, ya que aprovecha los recursos del sistema disponibles de manera más eficiente. Aunque el cmdlet Copy-Item no admite de forma nativa el procesamiento paralelo, PowerShell proporciona mecanismos como ForEach-Object -Parallel que se pueden usar con Copy-Item para lograr la copia de archivos en paralelo. Esto puede proporcionar potencialmente ganancias de rendimiento sustanciales en escenarios que involucran numerosos archivos o jerarquías de directorios complejas. A continuación se muestra un ejemplo básico:
<$sourcePath = "C:\SourceFolder"
$destPath = "D:\DestinationFolder"
Get-ChildItem $sourcePath | ForEach-Object -Parallel {
Copy-Item $_.FullName -Destination $using:destPath -Force
} -ThrottleLimit 8
Conclusión
El comando cmdlet Copy-Item es una herramienta versátil en PowerShell para la gestión de archivos y operaciones de directorios. Posee una variedad de parámetros para cubrir múltiples situaciones, como la capacidad de especificar una ruta de elemento de copia e implementar manejo de errores. Ya sea que estés utilizando un script de PowerShell para copiar archivos de una fuente a un destino o para copiar archivos localmente o a través de sistemas remotos, el cmdlet Copy-Item puede realizar funciones esenciales de copia de manera eficiente. Considera implementar procesamiento paralelo para mejorar el rendimiento en conjuntos de datos grandes y complejos o explorar herramientas especializadas diseñadas para manejar transferencias extensivas de datos. Dominar el cmdlet Copy-Item asegura transferencias de archivos precisas, convirtiéndolo en un componente esencial del kit de herramientas de cualquier usuario de PowerShell, mientras que entender sus limitaciones permite tomar decisiones informadas sobre cuándo emplear métodos alternativos.
Compartir en
Aprende más
Acerca del autor
Kevin Horvatin
Arquitecto Principal de Software
Kevin Horvatin es un Arquitecto de Software Principal en Netwrix y responsable de Netwrix Privilege Secure. Desarrollador de software por más de 20 años, ha trabajado con PowerShell y C# desde que fueron introducidos.