Массовая загрузка файлов с локального пути в SharePoint Online Разрешить амперсанд и фунт? - PullRequest
0 голосов
/ 14 октября 2018

Я использую PowerShell PnP v3 на Win 10 для массовой загрузки файлов и папок в SPO.Я использую скрипт с этой страницы: введите описание ссылки здесь , что прекрасно работает.Однако он будет пропускать файлы и папки, содержащие амперсанд (&) или символ фунта (#).Как можно обновить этот код, чтобы разрешить эти символы?Я новичок в Powershell, поэтому любая помощь очень ценится.

$cred=Get-Credential  
$makeUrl ="https://sharepoint.com/" 
$sourcePath = "C:\foldername"; 
$topSPOFolder = "one\two"; 

# connect to spo online 
Connect-PnPOnline -Url $makeUrl -Credentials $cred

$fileNames = Get-ChildItem -Path $sourcePath -Recurse ;

foreach($aFileName in $fileNames) 
{ 
if($aFileName.GetType().Name -ne "DirectoryInfo")  
{ 
 $filepath= [System.IO.Path]::GetDirectoryName($aFileName.FullName)+"\" 
 $Urlpath= ($filepath.Replace($sourcePath, '')); 
 $foldername=$Urlpath.Replace("/","\"); 
 $fn=$topSPOFolder+"\"+$foldername; 
 Add-PnPFile -Path $aFileName.FullName -Folder $fn; 
 $fn=$null 
 } 
}

1 Ответ

0 голосов
/ 15 октября 2018

Действительно, если имя файла содержит специальные символы (например, #), для Add-PnPFile cmdlet возникает следующее исключение:

Аргумент должен содержать одно имя файла и не может содержать путьсимволов.

И, похоже, о подобной проблеме уже сообщалось здесь

Дальнейший анализ исходного кода для Add-PnPFile командлет

  if (fileName.ContainsInvalidFileFolderChars())
                throw new ArgumentException(CoreResources.FileFolderExtensions_UploadFile_The_argument_must_be_a_single_file_name_and_cannot_contain_path_characters_, nameof(fileName));

подтверждает (по крайней мере, в 3.2.1810.0 версии), что:

  • # не разрешено
  • &допускается

Но учитывая тот факт, что поддержка и% в SharePoint Online и OneDrive для бизнеса была введена , не уверен, почему # по-прежнему не разрешен.Итак, я бы посчитал это ошибкой и рекомендую сообщить о проблеме в GitHub.

Между тем вы могли бы рассмотреть следующие решения:

Опция 1

Используйте следующую функцию для загрузки файла, имитирующего в некоторой степени Add-PnPFileкомандлет:

Function UploadAFile() 
{
Param(
  [Parameter(Mandatory=$True)]
  [string]$PathName,

  [Parameter(Mandatory=$True)]
  [String]$FolderName,

  [Parameter(Mandatory=$False)]
  [String]$FileName
)

   $ctx = Get-PnPContext

   if([string]::IsNullOrEmpty($FileName)){
      $FileName = [System.IO.Path]::GetFileName($PathName)
   }

   $folder = [Microsoft.SharePoint.Client.FileFolderExtensions]::EnsureFolder($ctx.Web,$ctx.Web.RootFolder, $FolderName)
   $fileUrl = [OfficeDevPnP.Core.Utilities.UrlUtility]::Combine($folder.ServerRelativeUrl, $FileName)

   $fci= New-Object Microsoft.SharePoint.Client.FileCreationInformation
   $fci.Overwrite = $true
   $fci.Content = [System.IO.File]::ReadAllBytes($PathName)
   $fci.Url = $FileName
   $uploadFile = $folder.Files.Add($fci)
   $ctx.ExecuteQuery()
   return $uploadFile
}

Пример

UploadAFile  -PathName "./Guide #123.docx" -FolderName "Shared Documents" 

Опция 2

Заменить все не поддерживаемые специальные символы с использованием -NewFileName параметр командлета Add-PnPFile, например:

Add-PnPFile -Path "./Guide #123.docx" -Folder "Shared Documents" -NewFileName "Guide 123.docx"
...