はじめに
デジカメやアクションカムで撮影した写真がたまってきたから整理したいな
特定の日付以降の写真だけコピーしたい
フォルダ構造が複雑でSDカードのどこに保管されているかわからない
という場面はよくあります。
しかし、手作業でファイルを探したり、種類ごとに仕分けしたりするのはかなり面倒です。
そこで今回、ユーザーが入力した日付以降のファイルだけをコピーする PowerShell スクリプトを作成しました。
コピー先フォルダの作成や、ファイル名の重複回避にも対応しているため、バックアップや整理作業が一気に楽になります。
この記事では、スクリプトの説明からコード全文、応用方法まで分かりやすく紹介していきます。
今回作ったスクリプトでできること
この PowerShell では、次のような処理が自動で行えます。
- ユーザーが入力した日付(YYYYMMDD形式)以降に作成されたファイルだけコピー
- ファイル形式(jpg / mp4 など)の複数指定に対応
- コピー元・コピー先フォルダは変数で自由に変更可能
- コピー先フォルダが存在しない場合は自動作成
- ファイル名が重複した場合は
(1)(2)のように番号を付けて上書き防止 - 階層をまたいでファイル検索(-Recurse)
写真・動画の整理はもちろん、SDカードのバックアップや NAS への保存にも使える汎用スクリプトです。
スクリプトの動作イメージ

- PowerShell が起動すると「入力した日付以降をコピー (YYYYMMDD)」と表示される
- 入力した日付以降に作成された JPG・MP4 をすべて検索
- コピー先フォルダにファイルをコピー
- 同名ファイルがある場合は自動的に
(1)を付与して安全に保存
例えば、
20251201 を入力すれば、2025年12月1日以降のファイルを一括コピーできます。
仕組みのポイント解説
ここからは、コードの重要ポイントを初心者でも理解しやすいよう解説していきます。
コピー元・先・拡張子を変数で管理
$sourceFolder = "F:\" # SDカードなど $destinationFolder = "D:\data1\sd\photo" $extensions = "jpg,mp4"
記事の読者が自分の環境に合わせて編集できるよう、パラメータは上部にまとめていますのでご自身の環境に合わせてご変更ください。
日付をユーザー入力で受け取る
$startDateString = Read-Host "入力した日付以降をコピー (YYYYMMDD)" $startDate = [datetime]::ParseExact($startDateString, "yyyyMMdd", $null)
撮影日基準で抽出したいので、任意の日付を指定できるようになっています。
ParseExact() を使うことで、YYYYMMDD形式以外はエラーにし、間違いを防ぎます。
コピー先フォルダが無い場合は自動作成
if (-Not (Test-Path -Path $destinationFolder)) {
New-Item -ItemType Directory -Path $destinationFolder
}
初回実行時にフォルダを作り忘れていても安心です。
複数拡張子をまとめて処理
$extensionsList = $extensions -split "," | ForEach-Object { $_.Trim() }
jpg, mp4 などの文字列を、処理しやすいように配列に変換しています。
これにより、JPG と MP4 の両方をまとめて検索 → コピーという動作が可能になります。
指定日付以降のファイルを抽出
$files = Get-ChildItem -Path $sourceFolder -Recurse -Filter $searchPattern |
Where-Object { $_.LastWriteTime -ge $startDate }
-Recurse:すべてのフォルダ階層から検索LastWriteTime:ファイル更新日(撮影日が近い)
これにより、希望した日付以降のファイルだけが抽出されます。
ファイル名が重複したら連番を付与
while (Test-Path $destPath) {
$destPath = Join-Path -Path $destinationFolder -ChildPath ("{0} ({1}){2}" -f $baseName, $counter, $extension)
$counter++
}
指定フォルダの階層下にあるファイルを対象としているため、コピー先に同じ名前のファイルがある場合は自動で (1) (2) のようにリネームして保存します。
最後にファイルをコピー
Copy-Item -Path $file.FullName -Destination $destPath -Force Write-Output "Copied: $($file.FullName) to $($destPath)"
コピーしたファイルのログも出力するので、後で確認できます。
自動コピースクリプトコード
# パラメータを固定値に設定
$sourceFolder = "F:\"
$destinationFolder = "D:\data1\sd\photo"
$extensions = "jpg,mp4"
# ユーザーに対話形式で日付を入力させる
$startDateString = Read-Host "入力した日付以降をコピー (YYYYMMDD)"
# 入力された日付をdatetime型に変換
try {
$startDate = [datetime]::ParseExact($startDateString, "yyyyMMdd", $null)
} catch {
Write-Output "Invalid date format. Please enter the date in YYYYMMDD format."
exit
}
# フォルダパスの存在確認と作成
if (-Not (Test-Path -Path $destinationFolder)) {
New-Item -ItemType Directory -Path $destinationFolder
}
# 拡張子のリストを作成及び前後の空白をトリム
$extensionsList = $extensions -split "," | ForEach-Object { $_.Trim() }
foreach ($extension in $extensionsList) {
# 拡張子にワイルドカードを追加 (例: jpg -> *.jpg)
$searchPattern = "*.$extension"
# 指定日付以降で拡張子が一致するファイルを取得
$files = Get-ChildItem -Path $sourceFolder -Recurse -Filter $searchPattern |
Where-Object { $_.LastWriteTime -ge $startDate }
foreach ($file in $files) {
# コピー先のパス
$destPath = Join-Path -Path $destinationFolder -ChildPath $file.Name
# ファイル名の重複を避けるため、同じファイル名が存在した場合に番号を付加
$counter = 1
$baseName = [System.IO.Path]::GetFileNameWithoutExtension($file.Name)
$extension = $file.Extension
while (Test-Path $destPath) {
$destPath = Join-Path -Path $destinationFolder -ChildPath ("{0} ({1}){2}" -f $baseName, $counter, $extension)
$counter++
}
# ファイルをコピー
Copy-Item -Path $file.FullName -Destination $destPath -Force
Write-Output "Copied: $($file.FullName) to $($destPath)"
}
}
実行例
実際にスクリプトを実行すると、以下のようなログが表示されます。
Copied: F:\DCIM\100MSDCF\IMG_2345.JPG to D:\data1\sd\photo\IMG_2345.JPG Copied: F:\DCIM\100MSDCF\IMG_2346.JPG to D:\data1\sd\photo\IMG_2346 (1).JPG Copied: F:\MOV\VID_0012.MP4 to D:\data1\sd\photo\VID_0012.MP4
重複があっても安全に保存されていることが分かります。
カスタマイズ方法
用途に合わせて簡単に変更できます。
① 対象拡張子を増やす
$extensions = "jpg, jpeg, png, mp4, mov, arw"
RAW や MOV にも対応できます。
② サブフォルダ構造ごとコピーしたい
Copy-Item -Recurse
を追加すればフォルダごとコピーできます。
③ 撮影日時(EXIF)で抽出したい
JPEGのEXIFタグ「DateTaken」を読み取り、撮影日でフィルタする処理も応用できます。
まとめ
- 手動で写真・動画を探すより圧倒的にラク
- 日付フィルタ+重複ファイル名回避で安全
- 変数を変えるだけで好みに合わせてカスタマイズ可能
- PowerShell の実践的なスクリプトとしても学びやすい
撮影データをよく扱う方、SDカードを定期的にバックアップしたい方には非常に便利です。
ぜひ、自分の用途に合わせてカスタマイズしてみてください!

【改訂新版】 Windows PowerShell ポケットリファレンス
PowerShell の基本コマンドから応用スクリプトまで、すぐ動くサンプルで学べる実践書です。
ファイル操作・条件分岐・ループ・エラーハンドリングなど、“実際に手を動かす” ことで理解が進みます。
PowerShell の基礎力と応用力を同時に高めたい人におすすめです。
おすすめポイント:
- 動作するサンプルが豊富で理解が早い
- 自動化に必要な基礎文法〜実践スクリプトを広くカバー
- 初級者から中級者へのステップアップに最適