NikonTransfer2は撮影画像の差分取り込みを実施するソフトです。
使えないNikonTransfer2のかわりに、PowerShellスクリプトを組みました。
ニコン以外のカメラにも使えます。
差分転送スクリプト 著作権表示 木村芳文 ダウンロード
Ver3.2 2025_09_25 zannennikon32.zip 処理に要した時間を計測、細部見直し
Ver3.1 2025_09_05 zannennikon31.zip コンソール出力を改良
Ver3.0 2025_08_28 zannennikon30.zip 繰り返し処理に対応、進捗表示を改良
Ver2.6 2025_08_24 zannennikon26.zip コンソール出力を改良
Ver2.5 2025_08_23 zannennikon25.zip 進捗表示を改良 INIファイル名をps1ファイルと同一名称に変更
スクリプトの導入と使い方 Nikon Transfer2を何とかする件 ざんねん NIKON プロジェクト
https://youtu.be/zjSWKEWJU7g
NikonTransfer2が、すごくざんねんな件
https://youtu.be/6IXKl0JI90g
■使用準備
ダウンロードした圧縮ファイルには下記が含まれます。
起動用バッチファイル(拡張子bat)
PowerShellスクリプトファイル(拡張子ps1)
設定ファイル(拡張子ini)
上記のファイルと同一フォルダにExifTool(exiftool.exeと関連ファイル)を配置してください(詳細後述)。
設定ファイルをお使いの環境にあわせて修正してください(詳細後述)。
フォルダは任意の場所に移動できます。
フォルダの名称は任意に変更できます。
起動用バッチファイル、PowerShellスクリプトファイル、設定ファイルは任意の名称に変更できます。ただし同じ名称にしてください。
転送先フォルダとログフォルダは設定ファイルで指定した任意の場所の任意の名称のフォルダを使用できます。
■ExifToolの入手と組み込み
ExifToolは使用者様が用意してください。
公式サイト(https://exiftool.org/)からExifToolをダウンロードして解凍してください。
ExifToolには64bit版と32bit版があります。OSのビット数に合致するものをご使用ください。
exiftool(-k).exe を exiftool.exe にリネームしてください。
PowerShellスクリプトファイルと同じフォルダに exiftool.exe と exiftool_filesフォルダを置くと組み込み完了です。
なお、ExifToolを使用して参照するEXIF情報は、DateTimeOriginal、Model、SerialNumber です。
■設定ファイルの編集
お使いの環境に合わせて編集してください。
メモ帳で修正して、ANSIで保存してください。
通常はそのまま保存するとANSIで保存できます。
設定値は ダブルクォーテーションで囲んでください。
targetRoot :転送先フォルダ。デフォルト値はPowerShellスクリプトファイルが格納されたフォルダ内に「転送先」という名称のフォルダが自動生成されるよう、相対パスで設定されてます。
logFolder :ログを保存するフォルダ。デフォルト値はPowerShellスクリプトファイルが格納されたフォルダ内に「ログ」という名称のフォルダが自動生成されるよう、相対パスで設定されてます。
extensions :指定した拡張子のファイルが転送対象になります。動画ファイルやその他の任意の拡張子も指定可能です。
scanDrives :取り込み元の自動検出対象になるドライブを指定します。記録メディアに割り当てられる可能性のあるドライブレターを設定してください。
folderSuffix :自動生成される日付別フォルダに追加される文字列です。(詳細後述)
■転送元ドライブの自動検出
scanDrivesで指定したドライブのうちで、ルートディレクトリ直下にDCIMフォルダが存在するドライブが転送元ドライブの選択肢に追加されます。
■転送元ドライブの手動設定
手動指定では、DCIMフォルダが存在しないドライブも含めて任意に指定可能です。
■転送対象ファイル
指定したドライブのルートディレクトリ配下(DCIMフォルダ内に限定しない)をスキャンして転送対象ファイルを選別します。
extensionsで指定した拡張子のファイルを転送対象とします。
ログを参照して撮影日時、カメラモデル名、シリアルナンバー、ファイル名で差分判定します。
よって、ダブルスロットに同時記録された同一名称のファイルは、取り込み済みと判定されます。
誤ってファイル数が極端に多いディスク(PC内蔵ディスク等)を指定すると、スキャンに要する時間が長大化してフリーズしたような状態になります。
その場合は、PowerShellウインドウを閉じてスクリプトの実行を停止してください。
■転送先フォルダ
targetRootで転送先フォルダを指定します。
転送先フォルダが存在しない場合は自動作成されます。
転送先フォルダ内部に、日付別フォルダを生成してファイルをコピーします。
■日付別フォルダ
folderSuffixが""の時は、撮影日、カメラモデル名称、2桁連番をアンダーバーで接続した文字列が日付別フォルダの名称になります。
2桁連番の初期値は01で、同じ名称の日付別フォルダが存在する場合は連番を更新します。
例.2025_08_18_NIKON Z 7_2_01
撮影日 : 2025_08_18
カメラモデル名称 : NIKON Z 7_2
folderSuffixに有効な文字列が設定されている場合は、撮影日、folderSuffix、2桁連番を接続した文字列が日付別フォルダの名称になります。
例.2025_08_18_5Ds_01
撮影日 : 2025_08_18
folderSuffix : _5Ds_
取り込み完了後に日付別フォルダの削除や名称変更を行っても、その後の差分取り込みに影響を与えません。
■ログ
logFolder でログ保存フォルダを指定します。
ログ保存フォルダが存在しない場合は自動作成されます。
ログファイルは日付別フォルダと同一名称のテキストファイルです。(例.2025_08_18_NIKON Z 7_2_01.txt)
ログの記録内容は 撮影日時 カメラモデル名 シリアルナンバー ファイル名 です。
同名のログファイルが存在する場合は、上書きしないでファイルの末尾からログを追記します。
ログ保存フォルダ内のすべてのファイルをスキャンして差分判定します。
差分取り込みを正しく実施するために、記録メディアをフォーマットするまでは関連するログを削除しないように注意してください。
記録済みのログファイルのファイル名を変更しても差分取り込みに影響を与えません。
一般的なPCであればファイル数で1万件以上のログが存在しても、大きなパフォーマンス低下は起こらないと考えられます。
コンソールに出力される「ログ読み込み」の時間を、ログを削除する目安にしてください。
■スクリプトの起動
本スクリプトは、外部のバッチファイルから起動することを前提に開発されています。
起動用バッチファイル(拡張子bat)をダブルクリックすると起動します。
起動用バッチファイルのショートカットを作っておくと便利です。
私はスタートメニューに起動用バッチファイルのショートカットを登録しています。その方法に興味がある人は検索するかAiに聞けば出てくると思います。
■スクリプト起動後の操作
起動すると取り込み対象候補のドライブと任意指定が選択肢として表示されます。
任意指定の場合は、続いてドライブレターの入力を要求されます。
取り込み対象ドライブの指定が完了すると確認メッセージが表示されますので[Enter]キーで処理が開始します。
一通り処理が完了後、連続して取り込み処理を続行できます。
続行前にPCに別のメディアを接続し直すことができます。
処理を終了する場合は、メニューに従うかPowerShellウインドウを閉じるだけで安全に終了できます。
■途中停止・強制終了
PowerShellウィンドウを閉じると処理が終了します。このことでデータが失われることはありません。
タイミングによっては転送先フォルダに、拡張子が.tmpの一時ファイルが残ることがあります。一時ファイルは削除しても問題ありません。
途中停止した場合、稀に最後にコピー完了したファイルがログに記録されないことがあります。そのまま同じメディアから再度取り込みを実施すると、ログに記録できなかった1個のファイルが重複して取り込まれますのでご注意ください。
■補足1 構成ファイルの保存はANSIで
Windowsの推奨文字コードはANSIからUTF-8に変更されましたが、これは建前で実装面では中途半端と言えます。
UTF-8は文字化けやその他の不安定動作が発生する確率が高くなります。
UTF-8での実行は諸々の対策をすれば不可能ではありませんが、対策方法は複雑で流動的な側面があります。
■補足2 デバイスの取り外しとディスクIOの確認を推奨
Windowsはクイック取り外しの機能がデフォルトで有効化されてますがこれは建前です。
見かけではファイルコピーが完了していても、ディスクへの物理的な書き込みが完了してない状況はありえます。
デバイスの取り外しを実施した後でも、ディスクへの物理的な書き込みが完了してない状況はありえます。
撮影データのような重要な大容量データの取り込み時に万全を期すならば、下記の手順を遵守することをおすすめします。
これは、本取り込みツールに限らず、他の方法でデータ取り込みを実施する場合にも共通の推奨事項です。
1.PCのアクセスランプやタスクマネージャーでディスクIOの停止を確認。
2.デバイスの取り外しを操作する。
3.物理的にメディアを取り外す。
4.取り込みデータに対して、移動、コピー、リネームなどのファイル操作を行う場合は、ディスクIOが停止した後に行う。
■補足3 DCF(Design rule for Camera File system)規格
DCF規格では記録メディアのルートディレクトリにDCIMフォルダを作り、その内部に撮影データ(静止画と動画)を保存するよう定められています。
ただし、一部のデバイスではDCF規格をベースとしながらも、独自のフォルダ構造を採用しています。
静止画を撮影した場合は、ほぼすべての機種はDCIMフォルダに静止画データを格納すると言えます。ただし、特殊用途機では例外があります。
動画を撮影した場合は、一部の機種はDCIMフォルダに動画データを格納しない場合があります。
例えば、SonyやPanasonic、GoPro、DJI Osmoなどの一部機種は独自のフォルダ構造を採用している場合があります。
以上をふまえて、本取り込みスクリプトはDCF規格に準拠しないデバイスにも対応できるように下記の設計としました。
・転送元ドライブ候補の自動選定は、DCIMフォルダの有無で判定する。
・転送元ドライブの手動設定では、DCIMフォルダがないドライブも設定可能。
・転送対象ファイルは、DCIMフォルダの内部に限定しないで転送元ドライブ中のすべてのファイルから拡張子で判定する。
このように柔軟性をもたせた代償として、誤ってPC内臓の大容量ドライブ等を取り込み対象ドライブとして指定すると、差分判定対象ファイル数が極端に増大することが原因でフリーズ状態になってしまうことがあります。その場合はPowerShellウインドウを閉じるだけで安全に終了できます。
■補足4 取り込みスキップしたファイルのコンソール出力
ファイルコピーをスキップしたファイルもコンソールに出力する設計としています。
差分取込結果に視覚的な安心感を得ることができるので、このような設計にしました。
ただし、スキップするファイル数が数千件規模になると、本来のファイルコピーには関係ない無駄な時間が気になってくると思います。
運用を続けながら、場合によってはスキップしたファイルのコンソール出力を停止するよう改良したいと思います。
この件、ご意見がありましたらご連絡をお願いします。