Copiando archivos. No es sexy, pero debe hacerse. En la GUI, copiamos y pegamos con el portapapeles, pero en PowerShell tenemos un cmdlet llamado Copy-Item.
Los comandos para copiar archivos han existido desde siempre en todos los lenguajes de shell. En el mundo de PowerShell, la forma más popular de copiar un archivo o carpeta en tu script de PowerShell de un punto A a un punto B es usando el cmdlet Copy-Item
. Este cmdlet nos permite copiar un archivo y una carpeta dándonos la capacidad de recorrer archivos en una carpeta, usar comodines para seleccionar los archivos que necesitamos copiar e incluso utilizar PowerShell Remoting para copiar archivos!
Este cmdlet es parte de los cmdlets del proveedor PowerShell. Es un cmdlet genérico reconocido por su sustantivo Item. La mayoría de estos cmdlets de proveedores se pueden usar en diferentes proveedores, pero en mis casi 10 años de uso de PowerShell, solo he visto que se use Copy-Item
con el proveedor del sistema de archivos.
Al usar este cmdlet
, PowerShell permite a un desarrollador copiar archivos y carpetas de varias maneras diferentes.
Uso básico
En su forma más básica, el cmdlet Copy-Item
copia un solo archivo de un punto A a un punto B utilizando el parámetro Path
como la ruta del archivo de origen y el parámetro Destination
como la ruta de la carpeta de destino.
Este cmdlet también puede copiar carpetas vacías. Enumeraré los elementos en la carpeta C:\EmptyFolder y luego los copiaré.
Tal vez haya un archivo de solo lectura en la carpeta. Por defecto, Copy-Item
no lo sobrescribirá. Para forzar la sobrescritura, simplemente agrega el parámetro Force
.
Seleccionando concretamente con Copy-Item
Además de copiar un solo archivo o carpeta, también podemos copiar todo el contenido de una carpeta. El parámetro Path
de Copy-Item acepta caracteres comodín como el asterisco para coincidir con uno o más caracteres o el signo de interrogación para coincidir solo con un carácter.
Combinando varias carpetas
Otra característica genial de Copy-Item
es su capacidad para copiar múltiples carpetas juntas al mismo tiempo. Al pasar múltiples rutas al parámetro Path
, Copy-Item
examinará cada una, copiará ya sea la carpeta o el archivo(s) dependiendo de la ruta y los “fusionará” todos en el destino único.
Copiando archivos recursivamente
Lo más probable es que no tengas suerte y tengas todos los archivos en una sola carpeta sin carpetas también. Normalmente nos encontramos con situaciones donde tenemos muchas subcarpetas en la carpeta principal que también contienen archivos que nos gustaría copiar. Al usar el parámetro Recurse
en Copy-Item
, buscará en cada subcarpeta y copiará todos los archivos y carpetas en cada una recursivamente.
Observa aquí que estoy canalizando archivos y carpetas desde Get-ChildItem
directamente a Copy-Item
. ¡Copy-Item
tiene soporte para canalizaciones!
Ventajas de usar el parámetro PassThru
Muchos cmdlets en PowerShell tienen un parámetro PassThru. Los cmdlets que típicamente no devuelven nada pueden devolver los objetos que están manipulando utilizando el parámetro PassThru. Este cmdlet no es diferente. Cuando comencé a escribir scripts, nunca usaba este parámetro porque no sentía que lo necesitara.
Por ejemplo, si quisiera copiar un archivo a una ubicación remota y luego hacer referencia a ese archivo más adelante en mi script, haría algo como esto:
Este método funciona pero puede ser mejor. En lugar de definir una variable para la ruta remota, ¿por qué no simplemente capturar el objeto que se devuelve del cmdlet Copy-Item
al usar el parámetro PassThru
en su lugar? Los objetos devueltos siempre tendrán la ruta del archivo de destino.
Copiando archivos usando una sesión de PowerShell remota
Una característica interesante que llegó con PowerShell v5 es la capacidad de este cmdlet de no usar el protocolo SMB por defecto para transferir un archivo, sino usar WinRM y una sesión remota de PowerShell. Al usar el parámetro Session
, Copy-Item
utiliza una sesión de PowerShell existente y transfiere los archivos de esa manera. Esta es una excelente manera de evitar los firewalls y cuando la comunicación de la sesión está encriptada, también es una capa adicional de seguridad.
Pudimos haber copiado el archivo File.txt a través de SMB y esperado que el recurso compartido de administrador C$ estuviera disponible y utilizado la ruta de destino \\WEBSRV1\c$
. Sin embargo, como utilizamos el parámetro ToSession
en su lugar, la ruta de destino siempre será la ruta local al equipo en el que se está ejecutando la sesión remota.
Resumen
El cmdlet Copy-Item
es uno de esos cmdlets principales de PowerShell que usarás una y otra vez. En PowerShell, copia archivos, carpetas de varias maneras diferentes con su simple pero poderoso especialmente con su capacidad para usar comodines, para fusionar múltiples carpetas de archivos juntas y para usar sesiones de PowerShell Remoting existentes!
Lectura adicional
