OneDrive同期フォルダ配下のフォルダAを外部ストレージドライブにコピーするPowerShellスクリプトを作成します。

オフラインにダウンロードされていないファイルは無視して、ダウンロードされているファイルは、タイムスタンプを確認し、新しいものであれば外部ストレージドライブにファイルをコピーするスクリプトを作成してください。 またフォルダ構造は極力同じ構造を維持し、存在しないフォルダがあれば、作成する処理を行ってください。

以下は、PowerShellでOneDrive同期フォルダ配下のフォルダを外部ストレージにコピーするスクリプトです。このスクリプトでは、オフラインのファイルは無視され、タイムスタンプを確認して新しいファイルだけをコピーします。また、フォルダ構造を維持しつつ、存在しないフォルダを作成する処理も含まれています。

# コピー元フォルダ (OneDriveフォルダ配下のフォルダA)
$sourceFolder = "C:\\\\Users\\\\<ユーザー名>\\\\OneDrive\\\\フォルダA"

# コピー先フォルダ (外部ストレージドライブ)
$destinationFolder = "E:\\\\Backup\\\\フォルダA"

# フォルダが存在しない場合は作成
if (!(Test-Path -Path $destinationFolder)) {
    New-Item -ItemType Directory -Path $destinationFolder | Out-Null
}

# 再帰的にコピー処理を行う
function Copy-FilesRecursively {
    param (
        [string]$sourcePath,
        [string]$destPath
    )

    # コピー元フォルダの内容を取得
    $items = Get-ChildItem -Path $sourcePath -Force

    foreach ($item in $items) {
        # ファイルかフォルダを判定
        if ($item.PSIsContainer) {
            # フォルダの場合
            $newDestPath = Join-Path $destPath $item.Name

            # コピー先フォルダが存在しなければ作成
            if (!(Test-Path -Path $newDestPath)) {
                New-Item -ItemType Directory -Path $newDestPath | Out-Null
            }

            # 再帰的に処理
            Copy-FilesRecursively -sourcePath $item.FullName -destPath $newDestPath
        } else {
            # ファイルの場合
            if ($item.Attributes -notmatch "Offline") {
                $destFilePath = Join-Path $destPath $item.Name

                # ファイルが存在しないか、新しい場合のみコピー
                if (!(Test-Path -Path $destFilePath) -or ($item.LastWriteTime -gt (Get-Item -Path $destFilePath).LastWriteTime)) {
                    Copy-Item -Path $item.FullName -Destination $destFilePath -Force
                }
            }
        }
    }
}

# 処理実行
Copy-FilesRecursively -sourcePath $sourceFolder -destPath $destinationFolder

Write-Host "コピー処理が完了しました。" -ForegroundColor Green

スクリプトの説明

  1. 変数設定

    $sourceFolderにOneDriveフォルダ配下のコピー元フォルダ、$destinationFolderに外部ストレージのコピー先フォルダを設定します。

  2. フォルダ作成

    コピー先フォルダが存在しない場合、新規作成します。

  3. 再帰処理

    Copy-FilesRecursively関数を使用してフォルダとファイルを再帰的に処理します。

  4. オフラインファイルのスキップ

    $item.Attributesに"Offline"が含まれている場合、そのファイルを無視します。

  5. タイムスタンプの比較

    ファイルが存在しない、またはコピー元の方が新しい場合のみコピーを行います。

  6. フォルダ構造の維持

    New-Itemで必要に応じてフォルダを作成し、構造を維持します。

使用方法

  1. <ユーザー名>を適切なユーザー名に置き換えます。
  2. 必要に応じてコピー元とコピー先のパスを調整します。
  3. スクリプトを保存し、PowerShellで実行します。

注意: 実行前にバックアップやスクリプトの動作をテストすることをお勧めします。

以下の変更を行ってください。

以下のように変更を加えたスクリプトを記載します: