【问题标题】:Move specifics files from a sharepoint library to an other将特定文件从共享点库移动到另一个
【发布时间】:2020-07-23 11:55:28
【问题描述】:

这是我的问题。上周我的共享点基础架构发生了一起事件,许多文件已移至不同的错误库。我从 sql 中提取以查找所有这些坏文件并将此选择导出到 csv。现在我正在尝试编写一个脚本,以便将这些文件(及其元数据)移动到正确的库中。

我已经尝试过这个例子:https://www.sharepointdiary.com/2016/03/copy-files-between-document-libraries-using-powershell-in-sharepoint.html

做了这样的事情:

##Script copie de fichiers d'une librairie à une autre

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

Start-Transcript -Path c:\temp\transcript.txt

#Variables
$WebURL="http://MySPurl"
$ListingTESTQual = Import-Csv -Path C:\temp\TestQualifMoveSP.csv -Delimiter ';' -Encoding UTF8
$SourceFileTEST = $ListingTESTQual.URLactuelle

$TargetLibrary = "TempoCourrier_MED"

 
#Get Objects
$Web = Get-SPWeb $WebURL
$SourceFileTEST = $Web.GetFile($SourceFileTEST)


#Copie Meta-Data
#$ItemPREV = $FilePREV.Item
#$ItemFSS = $FileFSS.Item

foreach($fichiers in $ListingTESTQual)

{
if ($ListingTESTQual.NomLot -match "PRE")
        {
        $FilePREV = $TargetLibrary.Files.Add($SourceFileTEST.Name, $SourceFileTEST.OpenBinary(), $true) 
        $ItemPREV = $FilePREV.item      
        $ItemPREV["Created"] = $SourceFileTEST.TimeCreated.ToLocalTime()
        $ItemPREV["Modified"] = $SourceFileTEST.TimeLastModified.ToLocalTime()
        $ItemPREV["Author"] = $SourceFileTEST.Author
        $ItemPREV["Editor"] = $SourceFileTEST.ModifiedBy
        $ItemPREV["STATUT"] = $SourceFileTEST.STATUT
        $ItemPREV["DateNumerisation"] = $SourceFileTEST.DateNumerisation
        }

else {
     if ($ListingTESTQual.NomLot -match "FSS")
        {
        $FileFSS = $TargetLibrary.Files.Add($SourceFileTEST.Name, $SourceFileTEST.OpenBinary(), $true)
        $ItemFSS = $FileFSS.Item
        $ItemFSS["Created"] = $SourceFileTEST.TimeCreated.ToLocalTime()
        $ItemFSS["Modified"] = $SourceFileTEST.TimeLastModified.ToLocalTime()
        $ItemFSS["Author"] = $SourceFileTEST.Author
        $ItemFSS["Editor"] = $SourceFileTEST.ModifiedBy
        $ItemFSS["STATUT"] = $SourceFileTEST.STATUT
        $ItemFSS["DateNumerisation"] = $SourceFileTEST.DateNumerisation
        }      
        
     }
}

 

#Update
$ItemPREV.UpdateOverwriteVersion()
$ItemFSS.UpdateOverwriteVersion()

我的 CSV 看起来像这样:

NomLot;URLactuelle;NomFichier;URLdestination    
PRE_Batch1.xml;http://ActualURL1;FileName1.pdf;http://DestinationURL1
FSS_Batch2.xml;http://ActualURL2;FileName2.pdf;http://DestinationURL2

我一运行脚本就收到了这条消息:

Exception lors de l'appel de «OpenBinary» avec «0» argument(s): «Le nom de
fichier ou de dossier contient des caractères non autorisés. Utilisez un autre
nom.»
Au caractère Ligne:6 : 9
+         $FilePREV = $TargetLibrary.Files.Add($SourceFileTEST.Name, $S ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : SPException

Impossible d’appeler une méthode dans une expression Null.
Au caractère Ligne:7 : 9
+         $ItemPREV["Created"] = $SourceFileTEST.TimeCreated.ToLocalTim ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation : (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

似乎语法有问题,我已经尝试寻找解释但找不到

有什么想法吗?

它甚至没有进入我的循环,这肯定是错误的!

【问题讨论】:

    标签: powershell loops sharepoint binary


    【解决方案1】:

    您的模块可能没有在这里导入:

    Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
    

    去掉Erroraction SilentlyContinue 并修复此错误,不要继续使用Add-PSSnapin,因为这是旧方法。导入模块的新模块是

    Import-Module xyz
    

    【讨论】:

      【解决方案2】:

      为了复制带有元数据和版本历史的文件。这是执行此操作的脚本。如果两个库的内容类型相同,那么这将更新所有字段。

          Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
          
          #Custom Function to Copy Files from Source Folder to Target
          Function Copy-Files($SourceFolder, $TargetFolder)
          {
              write-host "Copying Files from:$($SourceFolder.URL) to $($TargetFolder.URL)"
              #Get Each File from the Source
              $SourceFilesCollection = $SourceFolder.Files
              
              #Iterate through each item from the source
              Foreach($SourceFile in $SourceFilesCollection)
              {
                  $CountFileVersions = $SourceFile.Versions.Count
                  #Get the created by and created
                  $CreatedBy = $SourceFile.Author;
                  #Convert the "TimeCreated" property to local time
                  $CreatedOn = $SourceFile.TimeCreated.ToLocalTime();
                  #Loop Through Each File Version
                  for ($i = 0; $i -le $CountFileVersions; $i++){
                      #Initialize variables
                      $SourceProp;
                      $FileStream;
                      $ModifiedBy;
                      $ModifiedOn;
                      $VersionComment = "";
                      $MajorVer = $False;
                      #If Index is not the Last Published Version
                      if ($i -lt $CountFileVersions){
                              #Get all versions file, history, properties, createdBy, checkInComment
                              $fileSourceVer = $SourceFile.Versions[$i];
                              $SourceProp = $fileSourceVer.Properties;
      
                              $ModifiedBy = If ($i -eq 0) {$CreatedBy}  ELSE {$fileSourceVer.CreatedBy};
                              $ModifiedOn = $fileSourceVer.Created.ToLocalTime();
                              $VersionComment = $fileSourceVer.CheckInComment;
                              $MajorVer = If ($fileSourceVer.VersionLabel.EndsWith("0")) {$True} Else {$False}
                              $FileStream = $fileSourceVer.OpenBinaryStream();
                      }
                      else {
                              #Get current versions file, history, properties, createdBy, checkInComment
                              $ModifiedBy = $SourceFile.ModifiedBy;
                              $ModifiedOn = $SourceFile.TimeLastModified.ToLocalTime();
                              $SourceProp = $SourceFile.Properties;
                              $VersionComment = $SourceFile.CheckInComment;
                              $MajorVer = If ($SourceFile.MinorVersion -eq 0) {$True} Else {$False}
                              $FileStream = $SourceFile.OpenBinaryStream();
                      }
                      #URL library destination
                      $DestFileURL = $TargetFolder.URL + "/" + $SourceFile.Name;
                      #Add initial File to destination library         
                      $DestFile = $TargetFolder.Files.Add($DestFileURL, $FileStream, $SourceProp, $CreatedBy, $ModifiedBy, $CreatedOn, $ModifiedOn, $VersionComment, $True);
                      #Update all previous file versions
                      $itmNewVersion = $DestFile.Item;
                      $itmNewVersion["Author"] = $CreatedBy;
                      $itmNewVersion["Editor"] = $ModifiedBy;
                      $itmNewVersion["Created"] = $CreatedOn;
                      $itmNewVersion["Modified"] = $ModifiedOn;
                      $itmNewVersion.UpdateOverwriteVersion();
                      
                      #If Major Version Publish it
                      if ($MajorVer){
                          $DestFile.Publish($strVerComment);
                      }                 
                  }
              
                  Write-host "File:"$SourceFile.Name ." is uploaded successfully with version count:" $countVersions
              }
              
              #Process SubFolders
              Foreach($SubFolder in $SourceFolder.SubFolders)
              {
                  if($SubFolder.Name -ne "Forms")
                  {
                      #Check if Sub-Folder exists in the Target Library!
                      $NewTargetFolder = $TargetFolder.ParentWeb.GetFolder($SubFolder.Name)
          
                      if ($NewTargetFolder.Exists -eq $false)
                      {
                          #Create a Folder
                          $NewTargetFolder = $TargetFolder.SubFolders.Add($SubFolder.Name)
                      }
                      #Call the function recursively
                      Copy-Files $SubFolder $NewTargetFolder
                  }
              }
          }
          
          #Variables for Processing
          $WebURL="http://MySPurl/"
          $SourceLibrary ="SourceLibrary"
          $TargetLibrary = "DestinationLibrary"
          
          #Get Objects
          $Web = Get-SPWeb $WebURL
          $SourceFolder = $Web.GetFolder($SourceLibrary)
          $TargetFolder = $Web.GetFolder($TargetLibrary)
          
          #Call the Function to Copy All Files
          Copy-Files $SourceFolder $TargetFolder
      

      【讨论】:

        猜你喜欢
        • 2020-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-20
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        相关资源
        最近更新 更多