オフラインにダウンロードされていないファイルは無視して、ダウンロードされているファイルは、タイムスタンプを確認し、新しいものであれば外部ストレージドライブにファイルをコピーするスクリプトを作成してください。 またフォルダ構造は極力同じ構造を維持し、存在しないフォルダがあれば、作成する処理を行ってください。
以下は、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
変数設定
$sourceFolder
にOneDriveフォルダ配下のコピー元フォルダ、$destinationFolder
に外部ストレージのコピー先フォルダを設定します。
フォルダ作成
コピー先フォルダが存在しない場合、新規作成します。
再帰処理
Copy-FilesRecursively
関数を使用してフォルダとファイルを再帰的に処理します。
オフラインファイルのスキップ
$item.Attributes
に"Offline"が含まれている場合、そのファイルを無視します。
タイムスタンプの比較
ファイルが存在しない、またはコピー元の方が新しい場合のみコピーを行います。
フォルダ構造の維持
New-Item
で必要に応じてフォルダを作成し、構造を維持します。
<ユーザー名>
を適切なユーザー名に置き換えます。注意: 実行前にバックアップやスクリプトの動作をテストすることをお勧めします。
以下のように変更を加えたスクリプトを記載します:
($item.Attributes -band [System.IO.FileAttributes]::Offline)
でオフラインにダウンロードされているかをチェック。$excludeFolders
に省略可能な配列を指定。