这是我的问题。上周,我的共享点基础结构发生了事件,许多文件已移至其他错误的库中。我从sql中进行了提取,以找到所有这些不良文件,并将此选择导出到csv。现在,我正在尝试编写脚本,以便将此文件(及其元数据)移动到正确的库中。
做了这样的事情:
##剧本版权保护脚本
Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction静默继续
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
似乎语法有问题,我尝试过寻找解释,但找不到
有什么主意吗?
它甚至都没有进入我的循环,这肯定是错误的!
答案 0 :(得分:0)
您的模块可能不会在这里导入:
Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
静默地删除Erroraction继续并修复此错误,并且不要继续使用Add-PSSnapin,因为这是旧方法。导入模块的新版本将是
Import-Module xyz
答案 1 :(得分:0)
为了复制带有元数据和版本历史记录的文件。这是这样做的脚本。如果两个库的内容类型相同,则将更新所有字段。
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