参考にします。
以下のようなプロンプトだと再現が可能になるようだ
===============
【役割】
あなたはSharePoint OnlineおよびPnP PowerShellに精通した、エンタープライズ規模のシステム管理者兼エンジニアです。以下の要件と、非常に厳しい「手動認証環境でのタイムアウト前提」の制約をすべて満たす、本番運用向けの高品質なPowerShellスクリプトを作成してください。
【背景・目的】
SharePoint Onlineのドキュメントライブラリにて、10万件を超える大量のファイルを別フォルダへ一括コピーし、確実に配置されたことを検証する処理を自動化します。
【ディレクトリ要件】
対象: Shared Documents ライブラリ直下の A フォルダ内にある「ファイルのみ」(フォルダ自体は対象外)。
処理: Move ではなく Copy-PnPFile を使用する。元ファイル(Aフォルダ内)は削除しない。
コピー先(2箇所): 1. Shared Documents/B
2. Shared Documents/A/移動済
構造維持: Aフォルダ内のサブフォルダ階層を、コピー先の2箇所でも完全に再現(維持)すること。存在しないフォルダは自動作成(スクリプト内でキャッシュ変数等を用いてAPIコールを最小化)すること。
【処理・パフォーマンス要件】
10万件対応: メモリ枯渇や「5000件のリストビューしきい値」を回避するため、CAMLクエリを用いたサーバーサイドフィルタリングとページング(RowLimit Paged='TRUE')を実装すること。
スロットリング対策: 429 (Too Many Requests) や 503 エラーを捕捉し、Retry-After ヘッダーまたは指数バックオフを用いた待機処理(ラッパー関数)を実装すること。
存在確認: コピー実行後、直ちに Get-PnPFile で確認するのではなく、クラウドの反映遅延を考慮した「指数バックオフによる複数回のリトライ検証」を実装すること。
【環境制約(最も重要・厳守事項)】
手動認証の維持: 認証は証明書による無人実行ではなく、以下のコマンドを用いた「手動ログイン(ブラウザのポップアップでのID/PW入力)」で行います。
接続コマンド: 【現在使用している接続コマンド(例: Connect-PnPOnline -Url $SiteURL -Interactive など)】
ループ内の再接続禁止: 手動ログインであるため、処理ループ(foreach等)の内部でトークン更新を目的とした再接続処理(Connect-PnPOnlineの再実行)は絶対に記述しないこと。実行すると毎回ポップアップが出て処理が停止してしまいます。1000件等の区切りでは [System.GC]::Collect() によるメモリ解放のみを行ってください。
レジューム(再開)機能必須: 10万件の処理中、確実に認証トークンの有効期限が切れてスクリプトがエラー停止します。それを前提とし、1件処理が成功するごとにアイテムIDをCSV(チェックポイントファイル)に追記し、スクリプト起動時にそれを読み込んで「処理済みのアイテムを高速でスキップ」するロジックを必ず実装すること。
【運用・ログ要件】
テストモード: $IsTestMode = $true の場合、指定件数(例:3件)の処理で正常にループを抜けて終了する機能を設けること。
ログ出力: 処理日時、ファイル名、ステータス(SUCCESS/ERROR)、宛先、詳細(またはエラー内容)をCSV形式で出力すること。値にカンマが含まれる事故を防ぐため、出力時は各フィールドをダブルクォートでエスケープすること。
【出力形式】
設計の意図と「手動認証のタイムアウトをどのように乗り越えるか」を簡潔に説明した後、コピー&ペーストでそのまま実行可能な、コメントが豊富で可読性の高いPowerShellコードを出力してください。
===============
👉 PowerShell Extension
PowerShellでSharePoint Onlineのフォルダ情報を取得するスクリプトを作成してください。
# ■ 技術要件
・PnP PowerShellを使用すること
・Connect-PnPOnline -Interactive でログインすること
# ■ 対象
・ドキュメントライブラリ:Documents
・対象フォルダ:
- Shared Documents/テスト
- Shared Documents/テスト2
# ■ 処理内容(各フォルダごとに実行)
① フォルダを取得する
② ListItemAllFieldsを取得する
③ フォルダの権限一覧を取得する
・RoleAssignmentsからユーザー名と権限を表示
④ フォルダ直下のファイル数を取得する
・Get-PnPFolderItem を使用(ItemType File)
⑤ フォルダの最終更新日時を取得する
# ■ 実装条件
・foreachで複数フォルダに対応すること
・Write-Hostでログ出力すること
・フォルダが存在しない場合はスキップすること
・そのままコピペで実行可能な完全なコードにすること
# ■ 出力形式
・PowerShellコードのみ
・変数(サイトURLなど)は冒頭にまとめる
==============================
PowerShellでSharePoint Onlineを操作するスクリプトを作成してください。
PnP PowerShellを使用し、対話型認証(-Interactive)でログインする前提とします。
# ■ 前提条件
・対象はSharePoint Online
・PnP PowerShellモジュールを使用
・接続は Connect-PnPOnline -Interactive を使用
・ドキュメントライブラリは "Documents"
・フォルダパスは "Shared Documents" を使用
# ■ 実装したい処理(順番厳守)
① フォルダを作成する
・指定パス配下に新規フォルダを作成すること
② フォルダ名を変更する
・Move-PnPFolder を使用してリネームすること
③ フォルダの権限を確認する
・RoleAssignments を取得し、ユーザーと権限を一覧表示すること
④ 権限継承を解除する
・Set-PnPListItemPermission を使用すること
⑤ 特定ユーザーにフルコントロールを付与する
・sample@outlook.com に "Full Control" を付与すること
# ■ 追加要件
・フォルダの ListItem ID を取得して権限操作に使用すること
・フォルダ取得は FileRef を使って一致検索すること
・処理の各ステップで Write-Host によるログ出力を行うこと
・エラー時は処理を停止すること
# ■ 出力形式
・そのままコピペで実行可能な完全なPowerShellコード
・変数(サイトURL、フォルダ名など)は冒頭にまとめること
# ■ 注意事項
・"Shared Documents" は固定で使用すること
・サイトURLとFileRefのパスは一致させること