1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SharePoint Online DocumentLibrary List Retrive(取得) and Add(追加) Using PnP PowerShell (MFA)

Last updated at Posted at 2020-11-10

#YOutube 説明動画

YOutube 説明動画のリンク
image.png

#概要
SharePoint Online DocumentLibrary List Retrive(取得) and Add(追加) Using PnP PowerShell (MFA)

#説明
SharePoint のデータ移行や一覧作成するためのプログラム、こちらを内容に合わせて編集してください。

#主な機能
ドキュメントライブラリーの一覧取得、ファイルのアップロード・ダウンロード
リストの一覧取得、添付ファイルのアップロード・ダウンロード

#SharePoint イメージ

customlist1

image.png

documnt1

image.png

###################################
# 概要
# SharePoint Online  DocumentLibrary List Retrive(取得) and Add(追加) Using PnP PowerShell (MFA)
#
# 説明
# SharePoint のデータ移行や一覧作成するためのプログラム、こちらを内容に合わせて編集してください。
# 主な機能
# ドキュメントライブラリーの一覧取得、ファイルのアップロード・ダウンロード
# リストの一覧取得、添付ファイルのアップロード・ダウンロード

# ライセンス
# MIT License
#
# 作成者
# 株式会社エクシード・ワン 野呂清二
#
###################################


###################################
# モジュールの読み込み
# SharePoint PnP モジュールの読み込み
###################################
function loadMoudle($moduleName)
{
    if (-not (Get-Module -Name $moduleName)) {
        #PnPPowerShellのモジュールをインストールする
        Install-Module -Name $moduleName
    }
}

###################################
# Webログイン
# 最近MFAを利用しているSharePointが増えたので、Webログインにしています。
###################################
function login($SiteURL)
{

    #既にログインしていないか確認する
    $IsConnect =  $FALSE

    try {
        if (Get-PnPContext) {
            $IsConnect =  $TRUE
        }
    }
    catch {
    }


    #ログインしていない場合はログインする
    if($IsConnect -eq $FALSE)
    {
        #ログインしていない場合はWebログインする(MFAを回避するため)
        Connect-PnPOnline -Url $SiteURL -UseWebLogin
    }
}

###################################
# リスト一覧取得
###################################
function list_retrive($listName, $folder_date)
{
    $folder_Root_CSVFileName = $folder_date + "\list.csv"
    $hashTableCSVItems=@()

    #リスト一覧取得

    <#
    #CSV出力(A)
    $listItems= (Get-PnPListItem -List $listName -Fields $Global:selectProperties).FieldValues  
    #>


    #CSV出力(B)
    $Items= (Get-PnPListItem -List $listName -Fields "Title","detail")  
    foreach($Item in $Items){  
        #Write-Host "Title" : $listItem["Title"]  
        #Write-Host "Detail" : $listItem["detail"]  
        #Write-Host "---------------------------"  

        <#
        #CSV出力(A)
        $folder_Root_Id = $folder_date + "\" + $Item.ID + "\"
        $obj=New-Object PSObject              
        $Item.GetEnumerator() | Where-Object { $_.Key -in $Global:selectProperties }| ForEach-Object{ $obj | Add-Member Noteproperty $_.Key $_.Value}
        $hashTable+=$obj;  
        $obj=$null;  
        #>

        #CSV出力(B)
        $folder_Root_Id = $folder_date + "\" + $Item.Id + "\"
        $objCSVItem = New-Object PSObject
        $objCSVItem | Add-Member -MemberType NoteProperty -name "Id" -value $Item.Id
        $objCSVItem | Add-Member -MemberType NoteProperty -name "Title" -value $Item["Title"]
        $objCSVItem | Add-Member -MemberType NoteProperty -name "detail" -value $Item["detail"]

        #添付ファイル出力        
        New-Item -Path $folder_Root_Id -ItemType Directory
        $attachments = ForEach-Object{Get-PnPProperty -ClientObject $Item -Property "AttachmentFiles"} 
        $attachments | ForEach-Object { Get-PnPFile -Url $_.ServerRelativeUrl -FileName $_.FileName -Path $folder_Root_Id -AsFile } 


        #添付ファイルをセミコロンで、連結する(#splitで分解できるようにしておく)
        $hashTableAttachment = @()
        $attachments | ForEach-Object { $hashTableAttachment += $_.FileName} 
        $attachementsCombine = $hashTableAttachment -join ";" #splitで分解できるようにしておく
        $objCSVItem | Add-Member -MemberType NoteProperty -name "attachements" -value $attachementsCombine


        #CSV出力用にハッシュテーブルに入れる
        $hashTableCSVItems += $objCSVItem
    }  

    #CSVファイル出力 
    $hashTableCSVItems | export-csv $folder_Root_CSVFileName -NoTypeInformation  
}


###################################
# リスト書き込み(シンプル)
###################################
function list_writeItemSimple($listName, $itemTitle,$detail)
{
    $item=Add-PnPListItem -List $listName
    $newListItem = Set-PnPListItem -Identity $Item.Id -List $listName -Values @{"Title" = $itemTitle; "detail" = $detail}
}

###################################
# リスト書き込み(添付ファイル)
###################################
function list_writeItemAttachment($listName, $itemTitle,$detail,$attachments)
{
    $item=Add-PnPListItem -List $listName
    $newListItem = Set-PnPListItem -Identity $Item.Id -List $listName -Values @{"Title" = $itemTitle; "detail" = $detail}

    for ($a=0; $a -lt $attachments.length; $a++) {
        #Write-host " " $attachments[$a]
        list_writeAttachmentSub -item $item -fileWithPath  $attachments[$a]
    }
}

#書き込み(添付ファイルサブ)
function list_writeAttachmentSub($item, $fileWithPath)
{
    $ctx=Get-PnPContext
    $memoryStream = New-Object IO.FileStream($fileWithPath,[System.IO.FileMode]::Open)
    $fileName = Split-Path $fileWithPath -Leaf
    $attachInfo = New-Object -TypeName Microsoft.SharePoint.Client.AttachmentCreationInformation
    $attachInfo.FileName = $fileName
    $attachInfo.ContentStream = $memoryStream
    $attFile = $item.attachmentFiles.add($attachInfo)
    $ctx.load($attFile)
    $ctx.ExecuteQuery()
}


###################################
# ドキュメントライブラリ一覧取得
###################################
function doclib_retrive($documentName, $folder_date)
{
    $folder_Root_CSVFileName = $folder_date + "\document.csv"
    $hashTableCSVItems=@()

    $folder_Root_files = $folder_date + "\files\"
    New-Item -Path $folder_Root_files -ItemType Directory


    $Items = Get-PnPListItem -List $documentName -Fields "FileRef", "File_x0020_Type", "FileLeafRef"

    foreach($Item in $Items){  
        $hashTableCSVItems += New-Object PSObject -Property @{
            Path          = $Item["FileRef"]
            FileName      = $Item["FileLeafRef"]
            FileExtension = $Item["File_x0020_Type"]
        }

        #ファイル出力
        Get-PnPFile -Url $Item["FileRef"] -Path $folder_Root_files -FileName $Item["FileLeafRef"] -AsFile  
    }
    $hashTableCSVItems | Export-Csv -Path $folder_Root_CSVFileName -NoTypeInformation
}


###################################
# ドキュメントライブラリー書き込み
###################################
function doclib_writeItem($documentName, $attachments)
{
    #コンテキストを読み込む
    $ctx = Get-PnPContext
    $ctx.load($ctx.web)
    $ctx.executequery()

    #対象リストを探す
    $lists = $ctx.web.lists
    $ctx.load($lists)
    $ctx.executequery()
    $myList = $lists | Where-Object{$_.Title -match $documentName}


    ForEach ($attachment in $attachments) {
        #ローカルファイルパスからファイル名を取り出す
        $splits = $attachment.split("\")
        $length=$splits.length;  
        $newFileName = $splits[$length-1]; 

        #ファイルを準備する
        $newFile = new-object Microsoft.SharePoint.Client.fileCreationInformation
        $newFile.Url = $ctx.web.url + "/document1/" + $newFileName
        $newFile.Content = [System.IO.File]::ReadAllBytes($attachment)

        #アップロードする
        $addFile = $myList.RootFolder.Files.Add($newFile)
        $ctx.load($addFile)
        $ctx.executequery()
    }
}



###################################
###################################
# メインルーチン
###################################
###################################
 try {
    ######### モジュール読み込み、Webログイン ######### 
    loadMoudle -moduleName "SharePointPnPPowerShellOnline"
    login  -SiteURL  "https://exceedone.sharepoint.com/sites/dev-snoro-communication"


    $folder = "C:\temp"
    $folder_date = $folder + "\" + ([System.DateTime]::Now).ToString("yyyyMMdd_HHmmss")
    New-Item -Path $folder_date -ItemType Directory

    $files=@("C:\temp\c.txt","C:\temp\d.txt")



    ######### リスト 開始 #########     
    $listName = "customlist1"

    #リスト一覧取得
    list_retrive -listName $listName  -folder_date $folder_date

    #リスト書き込み(シンプル)
    list_writeItemSimple -listName $listName -itemTitle "tilte2" -detail "detail2"


    #リスト書き込み(添付ファイル)
    list_writeItemAttachment -listName $listName -itemTitle "title3" -detail "detail3" -attachments $files  
    ######### リスト 終了 ######### 

    ######### ドキュメントライブラリー 開始 ######### 
    $documentName = "document1"

    #ドキュメントライブラリー一覧取得
    doclib_retrive -documentName $documentName -folder_date $folder_date

    #ドキュメントライブラリー書き込み
    doclib_writeItem -documentName $documentName -attachments $files  
    ######### ドキュメントライブラリー 終了 ######### 
 }
 catch {
    $e = $_.Exception
    $line = $_.InvocationInfo.ScriptLineNumber
    $msg = $e.Message 
    Write-Host "Error: $e at $line" -foregroundcolor black -backgroundcolor Red
 }
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?