none
PowerShell RRS feed

  • Вопрос

  • помогите, необходимо заполнить поля в библиотеке документов из файла excel с помощью powershell. Получается заполнять в корне библиотеке..как обратиться к файлам в папках не понимаю.

    Скрипт

    $url = "http://"

    $filePath="C:\ .xlsx"
    #$sheetName="svr"
    $objExcel=New-Object -comobject Excel.Application
    $objWorkbook=$objExcel.Workbooks.Open($filepath)
    $Column1=1
    $Column2=2
    $Column3=3
    $Column4=4
    $Column5=5
    $xlCellTypeLastCell = 11
    $TotalsRow=61
    #$TotalsRow=5
    #$PhysicalDrive = $objWorkbook.Worksheets.Item(1)

    $snapin = Get-PSSnapin | Where-Object {$_.Name -eq ‘Microsoft.SharePoint.Powershell’}
    if ($snapin -eq $null) {
      Write-Host "Загрузка оснастки SharePoint Powershell"
      Add-PSSnapin "Microsoft.SharePoint.Powershell"
    #  Add-PSSnapin "Microsoft.SharePoint.SPQuery"
    }

    $spAssignment = Start-SPAssignment
     $web=Get-SPWeb $url
     $list=$web.lists["Нормативные документы"]

     
     
    # write-host ‘Загрузка завершена!!!’ -foregroundcolor "green"

        for ($Row=2;$Row -le $TotalsRow; $Row++) {



             $Name=$objWorkbook.ActiveSheet.Cells.Item($Row, $Column1).Value()
       

              $spqQuery = New-Object Microsoft.SharePoint.SPQuery
                $spqQuery.Query ='<Where><Contains><FieldRef Name="Name"/><Value Type="Text">' + $Name + '</Value></Contains></Where>'
               
                $spqQuery.ViewFieldsOnly = $true
                $splListItems = $List.GetItems($spqQuery)

                foreach($item in $splListItems)
     {
             #  $NAme_smi_item=$item["Name"]
              # Write-Host $item["Name"]

            if ($Name -eq $item["Name"]){
            $item["*****"]=$objWorkbook.ActiveSheet.Cells.Item($Row, $Column2).Value()
         #   $item["****"]=$objWorkbook.ActiveSheet.Cells.Item($Row, $Column3).Value()
         #   $item["*****"]=$objWorkbook.ActiveSheet.Cells.Item($Row, $Column4).Value()
       
            $item.Update()

            write-host $Name -foregroundcolor "green"
            }
           }
     }  
     $objExcel.Workbooks.Close()
    $objExcel.Quit()
    $objExcel = $null

    14 января 2016 г. 14:30

Ответы

  • Получите объект SPFolder и передайте его в свойство запроса $spqQuery.Folder = SPFolder
    • Помечено в качестве ответа Natalya_35 15 января 2016 г. 7:06
    14 января 2016 г. 15:05
  • Перебирать может получиться долго, предлагаю сначала получить папку одним запросом, а затем элементы папки вторым:

    Add-PSSnapin Microsoft.SharePoint.Powershell
    
    $web = Get-SPWeb http://portal
    $list = $web.GetList("Lists/MyList");
    #  В метод GetList передаете адрес списка
    $folderQuery = New-Object Microsoft.SharePoint.SPQuery;
    $folderQuery.Query = "<Where>
      <And>
        <BeginsWith>
          <FieldRef Name='ContentTypeId' />
          <Value Type='ContentTypeId'>0x0120</Value>
        </BeginsWith>
        <Eq>
          <FieldRef Name='Title'/>
          <Value Type='Text'>.....</Value>
        </Eq>
      </And>
    </Where>";
    #  ИД типа контента папки всегда начинается с "0x0120"
    #  Замените ..... на имя папки
    $resFolder = $list.GetItems($folderQuery);
    
    $itemsQuery = New-Object Microsoft.SharePoint.SPQuery;
    $itemsQuery.Query = .....;
    #  Замените ..... на ваш caml запрос
    $itemsQuery.Folder = $resFolder[0].Folder;
    $res = $list.GetItems($itemsQuery);
    
    #
    #  Ваши действия с результатами
    #
    
    $web.Dispose();

    • Помечено в качестве ответа Natalya_35 26 января 2016 г. 8:05
    15 января 2016 г. 13:13

Все ответы

  • Получите объект SPFolder и передайте его в свойство запроса $spqQuery.Folder = SPFolder
    • Помечено в качестве ответа Natalya_35 15 января 2016 г. 7:06
    14 января 2016 г. 15:05
  • Обратиться сразу к определенной папке не получилось.. перебираю все и ищу нужную.

    foreach ($ItemSub in $FolderName.SubFolders) {
    #write-host "Folder : " $FolderName.SubFolders[$i];
    if ($ItemSub.Name -eq $folder ) {

    [Microsoft.SharePoint.SPFolder] $FolderName = $ItemSub

    } else {
    foreach ($ItemSub1 in $ItemSub.SubFolders) {
    if ($ItemSub1.Name -eq $folder ) {

    [Microsoft.SharePoint.SPFolder] $FolderName = $ItemSub1

    }}

    $spqQuery.Folder=$FolderName

    может есть возможность сразу перейти в нужную папку?

    15 января 2016 г. 7:17
  • Перебирать может получиться долго, предлагаю сначала получить папку одним запросом, а затем элементы папки вторым:

    Add-PSSnapin Microsoft.SharePoint.Powershell
    
    $web = Get-SPWeb http://portal
    $list = $web.GetList("Lists/MyList");
    #  В метод GetList передаете адрес списка
    $folderQuery = New-Object Microsoft.SharePoint.SPQuery;
    $folderQuery.Query = "<Where>
      <And>
        <BeginsWith>
          <FieldRef Name='ContentTypeId' />
          <Value Type='ContentTypeId'>0x0120</Value>
        </BeginsWith>
        <Eq>
          <FieldRef Name='Title'/>
          <Value Type='Text'>.....</Value>
        </Eq>
      </And>
    </Where>";
    #  ИД типа контента папки всегда начинается с "0x0120"
    #  Замените ..... на имя папки
    $resFolder = $list.GetItems($folderQuery);
    
    $itemsQuery = New-Object Microsoft.SharePoint.SPQuery;
    $itemsQuery.Query = .....;
    #  Замените ..... на ваш caml запрос
    $itemsQuery.Folder = $resFolder[0].Folder;
    $res = $list.GetItems($itemsQuery);
    
    #
    #  Ваши действия с результатами
    #
    
    $web.Dispose();

    • Помечено в качестве ответа Natalya_35 26 января 2016 г. 8:05
    15 января 2016 г. 13:13
  • Антонов Антон, просьба перенести данное обсуждение обратно в раздел Sharepoint, т.к. вопрос непосредственно связан со скриптами Powershell для Sharepoint, это не общий вопрос по Powershell.
    18 января 2016 г. 11:13