none
actualizar carpetas de bibliotecas de sharepoint 2010 RRS feed

  • Pregunta

  • hola a todos estoy haciendo una migracion de una estructura de carpetas de bibliotecas de sharepoint por medio de un script con powershell y tengo el siguiente script

                                                                                                                                                                                                    

    Add-PSSnapin microsoft.sharepoint.powershell -ErrorAction SilentlyContinue
    #set-psdebug -step
    #establecer variables primera parte 
    ##


    # URL del sitio web que contiene la lista de fuentes
    $SourceWebURL =   "http://sharepoint:39674/sitios/desarrollo/autoEvaluacion" 
    # título de la biblioteca de origen donde residen los documentos
    $SourceLibraryTitle = "documentos"

    # URL de la web en la que desea transferir sus documentos
    $DestinationWebURL =  "http://sharepoint:17156/sitios/desarrollo/autoEvaluacion"


    # el título de la librería destino en la que desea almacenar los archivos
    $DestinationLibraryTitle = "documentos"

    ##
    # Script   comienza secuencia de comandos
    ##

    #Recuperar la web de origen, utilizando el parámetro proporcionado
    $sWeb = Get-SPWeb $SourceWebURL

    #Recuperar la lista de fuentes utilizando el parámetro proporcionado
    $sList = $sWeb.Lists | ? {$_.Title -eq $SourceLibraryTitle}

    #Recupere la web de destino utilizando el parámetro proporcionado
    $dWeb = Get-SPWeb $DestinationWebURL

    #Recuperar la lista de fuentes utilizando el parámetro proporcionado
    $dList = $dWeb.Lists | ? {$_.title -like $DestinationLibraryTitle}

    #Recuperar todas las carpetas en la lista de fuentes. Esto se utiliza para mantener la estructura de carpetas en bibliotecas de origen y de destino.
    # Esto excluye la carpeta de raiz
    $AllFolders = $sList.Folders

    #Recuperar la carpeta raíz en la lista de origen.
    $RootFolder = $sList.RootFolder

    #Devolver todos los archivos que existen directamente en la raíz de la biblioteca
    $RootItems = $RootFolder.files


    #hacer un bucle a través de cada uno de los documentos descubiertos en la raíz de la biblioteca y realice alguna acción
    foreach($RootItem in $RootItems) #| Where-Object    {$_.created -lt $fechaold}................................................................................................................................................................... 


    #aplicar condiciones........
    {

        #fecha = get-date
        #$fechaold = $fecha.AddDays(-30)

        $prop = $RootItem.properties
        #$prop.Chekc


       if($prop.Chekc  -eq $false )

       {




        #Obtener el flujo binario del archivo de referencia, de modo que podemos crear el mismo archivo en el entorno de destino
        $sBytes = $RootItem.OpenBinary() 



        #Crear un nuevo archivo utilizando el nombre y el flujo binario del documento original, asignarlo a una variable.
        # Esta variable se llamará más tarde cuando se establecen las propiedades
        $dFile = $dList.RootFolder.Files.Add($RootItem.Name, $sBytes, $true)

        #Devolver todos los campos del elemento de origen que no son de sólo lectura
        $AllFields = $RootItem.Item.Fields | ? {!($_.sealed)} #condicion .................................................

        #Bucle a través de todos los campos devueltos y realizar alguna accion
        foreach($Field in $AllFields)###
        {
            #Si el elemento de origen tiene una propiedad que coincide con el nombre del campo realice alguna accion
            if($RootItem.Properties[$Field.title])
            {
                #Si el archivo de destino no contiene la misma propiedad que el elemento de origen, realice alguna accion
                if(!($dFile.Properties[$Field.title]))
                {
                    #Agregue una propiedad al archivo que coincida con el título y el valor del mismo campo en el elemento original
                    $dFile.AddProperty($Field.Title, $RootItem.Properties[$Field.Title])
                }
                else
                {
                    #Si la propiedad ya existe, establezca el valor en el elemento de destino al mismo valor que estaba en el elemento de origen.
                    $dFile.Properties[$Field.Title] = $RootItem.Properties[$Field.Title] 

                }

            }
        }
        #Confirme los cambios actualizando el archivo de destino

        #$dFile.Update()
        }

    }

    la primera ves que lo ejecuto pasa la estructura bien y como la necesito pero en el momento de hacerlo por segunda vez me muestra un error porque ya existen las carpetas 

    me podrian ayudar a solucionar este problema gracias











    #--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    #segunda

    foreach($Folder in $AllFolders)
    {

    #reconstruyendo el ParentFolderURL, asegúrese de que no existe cada vez que cambiamos las carpetas
        #Remove-Variable ParentFolderURL #...........
        $varExists = Get-Variable ParentFolderURL -ErrorAction SilentlyContinue 
        if($varExists -ne $null)
        #if( Test-Path variable:global:ParentFolderURL)
        {
            Remove-Variable ParentFolderURL 
        }
        #reconstruyendo el ParentFolderURL, asegúrese de que no existe cada vez que cambie las carpetas
        $i = 0

        #Divida la URL de la carpeta en secciones separadas por "/"
        $FolderURL = $Folder.url.Split("/")

        #Realizar un número variable de acciones en relación con la URL de la carpeta en función del número de secciones en FolderURL
        while($i -lt ($FolderURL.count-1))
        {
        #Mantenga aprendiendo la sección de carpeta para crear la carpeta principal URL
        $ParentFolderURL = "$ParentFolderURL/" + $FolderURL[$i]

        #Incrementar la variable I para avanzar a través de la estructuraa de carpertas
        $i++
        }

        $CurrentFolder = $dList.Folders | ? {$_.url -eq $ParentFolderURL.substring(1)}
        #Si la lista de destinos no contiene una carpeta con el mismo nombre, creelo
       if(!($dlist.Folders| ? {$_.name -eq $Folder.Name}))
        {


            #Cree una carpeta en la biblioteca de destino con el mismo nombre que tenía en la biblioteca de origen, en la misma ubicación relativa
            $NewFolder = $dlist.Folders.Add(("$DestinationWebURL" + $ParentFolderURL), [Microsoft.SharePoint.SPFileSystemObjectType]::Folder, $Folder.name)

            #Finalice la creación de la carpeta llamando a la actualizacion

            $NewFolder.update() 
        }
        else 
        {
            #Si la carpeta ya existe, recuperar la carpeta donde se creara el archivo
           $NewFolder =  $dlist.Folders | ? {$_.name -eq $Folder.Name}

        }

        #Devolver todos los archivos de la lista de origen. Lo usaremos más tarde para realizar actualizaciones de los elementos
        $AllFiles = $sList.Items

        #Devolver todos los elementos de la carpeta actual
        $sItems = $Folder.folder.Files




        #Si la carpeta en la que estamos actualmente tiene más de cero objetos, realice algunas acciones
        if($Folder.Folder.Files.count -gt 0)
        {
            #Realizar algunas acciones contra cada objeto de la carpeta actual
            foreach($item in $sItems)
            {
               #$fecha = get-date
               #$fechaold = $fecha.AddDays(-30)

               $prop = $item.properties

               if($prop.Chekc  -eq $false )
               {

                #Obtener la URL relativa del elemento actual       
                #$Relative = ($Item.ServerRelativeUrl).substring(1)

                $Relative = ($Item.Url)
                #Sobre la base de la ruta relativa del elemento actual, recuperar el archivo desde el sitio
                $TargetItem = $AllFiles | ? {$_.URL -eq $Relative}

                #Recuperar el flujo binario del archivo actual
                $sBytes = $TargetItem.File.OpenBinary()

                #Cree un archivo en la biblioteca de destino, la misma carpeta relativa, utilizando el nombre del archivo actual y la secuencia binaria
                $dFile = $Newfolder.Folder.Files.Add($TargetItem.Name, $sBytes, $true)

                #Devuelva todos los campos para el elemento de origen que no se leen
                $AllFields = $TargetItem.Fields | ? {!($_.sealed)}

                #Bucle a través de todos los campos devueltos y realizar alguna accion
                foreach($Field in $AllFields)
                {
                    #Si el archivo de destino no contiene la misma propiedad que el elemento de origen, realice alguna aciion
                    if($TargetItem.Properties[$Field.Title])
                    {
                        #si el archivo de destino no contiene la misma propiedad que el elemento de origen realiza alguna accion
                        if(!($dFile.Properties[$Field.title]))
                        {
                            #Agregue una propiedad al archivo que coincida con el título y el valor del mismo campo en el elemento original
                            $dFile.AddProperty($Field.Title, $TargetItem.Properties[$Field.Title])
                        }
                        else
                        {
                            #Si la propiedad ya existe, establezca el valor en el elemento de destino al mismo valor que estaba en el elemento de origen.
                            $dFile.Properties[$Field.Title] = $TargetItem.Properties[$Field.Title]
                        }

                    }
                }
                #Confirmar los cambios actualizando el archivo de destino.
                $dFile.Update()
              } 
            }


        }


      # --------------------------------------delete item for chekc 


      $web = Get-SPWeb "http://sharepoint:39674/sitios/desarrollo/autoEvaluacion" 

      $Libraries = $web.Lists | where {$_.title -eq "documentos"}


     foreach ($library in $Libraries) {


       Write-Output "Getting files from $($library.Title)"

     $Files = $library.Items | where {$_.FileSystemObjectType -eq "file" -And ($_.File -Like "*.*" )}
       foreach ($file in $Files) {
        $p = $file.properties
        #$p.Chekc

       if($p.Chekc -eq $false ){

          #$file.delete()
        }
       }
      }
      #-----------------------------------------------------

    }

    miércoles, 5 de julio de 2017 4:36