Cada vez es mayor la cantidad de información que tenemos online y uno de esos destinos por excelencia es Sharepoint Online, vamos a ver como podemos, a través de Powershell, y de manera sencilla subir datos de manera masiva a nuestros sites sin depender de terceros elementos.

powershell subir archivos a sharepoint

 

En el cybertruco de hoy vamos a ver cómo a través de unos pocos comandos podemos subir a Sharepoint Online cualquier carpeta que tengamos en local o en red de manera desatendida. Para poder llevar esto a cabo necesitaremos logueanos con un usuario que sea site-collection administrator en el site al que queramos subir los documentos.

Hemos de tener presente que las limitaciones en cuanto a ficheros de Sharepoint se aplican en este proceso como en cualquier otro, los más relevantes que podrían afectarnos en este caso sería el límite de 30 millones de archivos por library y el tamaño máximo de cada uno de ellos de 15GB. Tenéis más info en el siguiente link.
Teniendo esto y el propio espacio libre que tengamos en nuestro site en cuenta vamos al lío. Lo primero de todos será abrir un terminal de Powershell como administrador y conectarnos al servicio de Sharepoint Online con el cmdlet connect-sposervice

Connect-sposervice -url https://cyberseguridad-admin.sharepoint.com -credential usuario@cyberseguridad.net

Este usuario puede ser cualquier administrador de Sharepoint. A continuación vamos a proveer valores a algunas variables que usaremos más adelante. Se trata de las siguientes:

  • $cred que contendrá las credenciales del administrador del site-collection, puede ser el mismo usuario que el anterior
  • $sourcefiles que contendrá la ruta a los archivos que queremos subir
  • $sourcepackage contendrá la ruta a un directorio en el que durante el proceso de preparación de ficheros se generarán toda una serie de archivos de log y xml
  • $targetpackage similar al anterior para el proceso final de preparación en el que por ejemplo se encripta cada fichero
  • $targetweb ruta al site de Sharepoint Online
  • $targetdoclib ruta de la librería de sharepoint en la que se subirán los archivos, podemos indicar carpetas dentro de la misma.

Con lo que podríamos tener una entrada a Powershell como la siguiente

$cred=(get-credential usuario@cyberseguridad.net)
$sourcefiles='\\nas1\imagenes'
$sourcePackage = 'C:\test\source'
$targetPackage = 'C:\test\target'
$targetweb='https://cyberseguridadnet.sharepoint.com/sites/imagenes'
$targetdoclib='documents'

Teniendo estas variables con el contenido correspondiente, vamos a crear el pack de migración con el cmdlet new-spomigrationpackage. Como vemos a continuación en este punto ya indicamos el origen de los archivos a copiar, la carpeta donde creará la información referente al pack y el destino de la subida. Adicionalmente hemos añadido dos parámetros que nos evitarán errores, el -ignorehidden para evitar subir archivos ocultos y el -replaceinvalidcharacters para evitar los errores con archivos y/o directorios que contengan caracteres extraños que no sean aceptados por Sharepoint.

New-SPOMigrationPackage -SourceFilesPath $sourceFiles -OutputPackagePath $sourcePackage -TargetWebUrl $targetWeb -TargetDocumentLibraryPath $targetDocLib -IgnoreHidden -ReplaceInvalidCharacters

Ahora tenemos que re-mapear el contenido del pack de migración de acuerdo con las características de nuestro site. Para ellos ejecutaremos el cmdlet converto-spomigrationtargetedpackage. Aquí es importante el parámetro -parallelimport ya que este le indica al cmdlet que cree multiples packs de migración, por una parte para teóricamente reducir el tiempo de migración total y por otra parte para subidas grandes para dividir automáticamente el contenido ya que Sharepoint recomienda no realizar subidas de más de 10 o 20 gigas en un solo pack. Aparte de este parámetro vemos que también indicamos el origen de los archivos a subir, la carpeta con el pack origen de migración, además de la carpeta donde se generará el pack destino de migración, las credenciales ya que ahora sí conectará al site y su url y librería.

$finalPackages = ConvertTo-SPOMigrationTargetedPackage -ParallelImport -SourceFilesPath $sourceFiles -SourcePackagePath $sourcePackage -OutputPackagePath $targetPackage -Credentials $cred -TargetWebUrl $targetWeb -TargetDocumentLibraryPath $targetDocLib

Tras almacenar esos packs en una variable, usamos la misma para pasar esos packs al cmdlet Invoke-SPOMigrationEncryptUploadSubmit que será el encargado de finalmente acabar de preparar todo el proceso y subir los ficheros. En este paso los ficheros se encriptan, se suben a blobs de Azure y de ahí pasan a nuestra librería de Sharepoint donde los podemos encontrar ya desencriptados.

$jobs = $finalPackages | % {Invoke-SPOMigrationEncryptUploadSubmit -SourceFilesPath $_.FilesDirectory.FullName -SourcePackagePath $_.PackageDirectory.FullName -Credentials $cred -TargetWebUrl $targetWeb}

Comprobar estado

Una vez realizado este paso nuestro trabajo pasa a estar en cola en Azure. Como usuarios no tenemos ningún control de la misma por lo que toca esperar. Esta cola está regulada por estricto orden de llegada y podemos enviar a la misma tantos trabajos como queramos (si existe algún límite en este aspecto no he encontrado documentación)

Para ver como van nuestros trabajos podemos comprobar su status con el cmdlet Get-SPOMigrationJobStatus. Una vez lanzado el trabajo estos se ponen en cola y muestran el estado “queue” una vez finalizados mostrarán el estado “none”.

Get-SPOMigrationJobStatus -TargetWebUrl $targetWeb -Credentials $cred -JobId $jobs.jobid

La opción gráfica

Microsoft también pone al servicio de sus clientes una herramienta gui para realizar la misma tarea llamada Sharepoint Migration Tool, la cual nos permite con unos sencillos pasos seleccionar el origen de los datos

subir archivos a sharepoint online

Esta herramienta es una buena alternativa a lo que hemos estado viendo a través de Powershell aunque obviamente no podremos utilizarla en servidores en los que no tengamos entorno gráfico ni para programar tareas de subida de contenido. Por otra parte para determinados escenarios en los que hablamos de TB de datos y cientos de miles de archivos parece ser significativamente más rápida que la opción a través de Powershell, aunque no permite ciertas opciones como la de reemplazar caracteres extraños..Podéis descargalo en el siguiente link.