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

#YOutube 説明動画

[YOutube 説明動画のリンク](https://youtu.be/W7XZFW7COHA)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154505/c5b0195d-624a-9431-d20b-8e23497dccf5.png)


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

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

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

#SharePoint イメージ
## customlist1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154505/a5017709-c7ce-4649-9a4a-cbab06171411.png)

## documnt1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154505/cccf2de6-910d-7c33-8a74-3007a1a9e426.png)


```powershell
###################################
# 概要
# 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
 }
```