none
PowerShell: Как "прицепить" вложение (файл) хранящийся в таблице MSSQL в элемент списка Sharepoint? RRS feed

  • Вопрос

  • Здравствуйте.

    Есть таблица в MSSQL, где в одном из полей хранятся бинарные объекты (файлы). Я научился читать при помощи PowerShell содержимое этих полей в таблице.

    Подскажите, как можно этот бинарный объект, что в поле таблицы, прицепить в виде вложения к элементу списка в SharePoint?

    В интернете нашел, как можно сохранить вложение элемента списка в виде файла, но это не совсем то что хотелось бы.
    Мне то нужно напрямую из таблицы сразу во вложение.. 

    Может как то можно это реализовать через файловый поток? или ещё как?  Подскажите плиз.

     

    18 сентября 2017 г. 12:59

Ответы

  • Добрый день!

    Вот пример:

    $w = Get-SPWeb http://List/Location/Url
    $l = $w.Lists["TheList"]
    
    foreach ($item in $l.Items)
    {
         $file = Get-Item "$($item.Title).csv"
         $stream = $file.OpenRead()
         $buffer = New-Object byte[] $stream.length
         [void]$stream.Read($buffer, 0, $stream.Length)
    
         $item.Attachments.AddNow($file.Name, $buffer)
    }

    А если вместо AddNow поставить Add, то нужно ещё $item.update();

    19 сентября 2017 г. 7:21

Все ответы

  • Мне хотя бы найти примерчик как при пом. PowerShell прочитать поле таблицы (это я уже умею) и преобразовать всё это в файл, но не на диске а в памяти...

    19 сентября 2017 г. 2:13
  • Нашел пример, как можно из таблицы MSSQL выцепить бинарный объёкт и сложить его в файл...

    $Dest = "C:\Temp\";
    
    # Stream buffer size in bytes.
    $bufferSize = 8192;
    
    # Create a byte array for the stream.
    $out = [array]::CreateInstance('Byte', $bufferSize)
    
    # Prepare MSSQL Environment
    $SqlServer = "SPSQL";
    $SqlCatalog = "BDPC";
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection;
    $SqlConnection.ConnectionString = "Server=$SqlServer; Database=$SqlCatalog; Integrated Security=True";
    $SqlConnection.Open();
    
    $SqlCmd = $SqlConnection.CreateCommand();
    
    # В attdata.sql единственный select
    # select top (1) * from attachment where attachment_task_id = 33748
    $SqlCmd.CommandText = get-content C:\temp\attdata.sql;
    $objReader = $SqlCmd.ExecuteReader();
    
    while ($objReader.read()) {
      
      # В $objReader.GetValue(3) - название файла
      # В $objReader.GetValue(6) - двоичный объект (сам файл)
      Write-Output ("Exporting: {0}" -f $objReader.GetValue(3));
      $fs = New-Object System.IO.FileStream ($Dest + $objReader.GetValue(3)), Create, Write;            
      $bw = New-Object System.IO.BinaryWriter $fs;         
    
      $start = 0;              
      $received = $objReader.GetBytes(6, $start, $out, 0, $bufferSize - 1);
      While ($received -gt 0)
      {  
         $bw.Write($out, 0, $received);
         $bw.Flush();
         $start += $received;
         $received = $objReader.GetBytes(6, $start, $out, 0, $bufferSize - 1);
      }
      
      $bw.Close();            
      $fs.Close(); 
    }
    
    $fs.Dispose();            
    $objReader.close();
    
    Write-Output ("Finished");
    Теперь это как то надо прицепить как вложение к элементу списка в SharePoint ((

    19 сентября 2017 г. 5:15
  • Добрый день!

    Вот пример:

    $w = Get-SPWeb http://List/Location/Url
    $l = $w.Lists["TheList"]
    
    foreach ($item in $l.Items)
    {
         $file = Get-Item "$($item.Title).csv"
         $stream = $file.OpenRead()
         $buffer = New-Object byte[] $stream.length
         [void]$stream.Read($buffer, 0, $stream.Length)
    
         $item.Attachments.AddNow($file.Name, $buffer)
    }

    А если вместо AddNow поставить Add, то нужно ещё $item.update();

    19 сентября 2017 г. 7:21
  • Благодарю!
    19 сентября 2017 г. 8:53