このスクリプトを使って、データ消失などが発生した場合でも、当方では、責任が持てませんので、利用される場合は、事前にバックアップを行ってご利用ください。また、サポートや質問を送っていただいても、お答えできませんので、ご了承ください。
メモリーから、コピーするときに、わざわざ重いソフトを立ち上げて、コピーする、もちろん、取り込みを考えると、いろいろ出来るし、便利なんだけど、でも、複数のソフトを使っている身とすれば、単純に、メモリーから特定のフォルダーにコピーするだけなのに・・・
ネットをいろいろ探して、実際使ってみても、コピー完了!とか表示されても出来てなかったり、余分な機能はあるんだけど、設定が作った人はわかりやすいのかもしれないけど、使う立場に立つと、良くわからなかったり、結局、無いという結論。
なら、作るしかないかと、作ったのがこれ。
Windows10では標準で、Powershellが搭載されているので、すぐに使える。そのかわり、GUIではないので、ちょっとだけ慣れが必要かも。
$dataFolderから$targetPathにJPGファイルとRAWファイルをコピーする単純仕様。
もう少し、詳しく解説すると、JPGファイルから、Exif情報を読み取っているので、RAW+JPEGで記録している場合に、最適に動作します。RAWファイルのコピー部分をコメントアウトすれば、JPGファイルのみコピーすることも可能です。
フォルダ構造は、$targetPathの配下に、年\月\日のフォルダが作成。表示のスクリプトならF:\Photo\2020\08\29な感じです。日付ごとにフォルダとなります。
同フォルダに同名のファイルが存在した場合は、JPGファイルの場合は、警告、RAWファイルの場合はエラーとなって、コピーされません。
Windows標準のライブラリでは、JPGのExifしか読まないので、JPGを読んで、同名のRAWとセットでコピーするという仕様、エクスプローラーだと、RAWでもExif情報読み込んでいるので、Powershellでも読み込めると思うのですが、勉強不足でわかりません。
動作した環境 Widnows10 (1909) / PowershellCore 7.0.3
using namespace System using namespace System.Drawing using namespace System.IO using namespace System.Text using namespace System.Diagnostics using namespace System.Linq using namespace System.Collections.Generic using namespace System.DirectoryServices $dataFolder = "F:\DCIM" $targetPath = "E:\Photo" $targetExtension = "*.jpg" $targetRawExtension = ".ARW" $tempFolder = [DirectoryInfo]::new($dataFolder) $tempFiles = $tempFolder.EnumerateFiles($targetExtension,"AllDirectories") foreach($tempFile in $tempFiles){ $rawExif = [Bitmap]::new($tempFile.FullName) foreach($temp in $rawExif.PropertyItems.GetEnumerator()){ if($temp.Id -eq "36867"){ $rawDate = [Encoding]::ASCII.GetString($temp.Value) $changeDate = [Datetime]::Parse((($rawDate.split(" "))[0]).Replace(":","/")) $createFolder = $targetpath + "\" + $changeDate.ToString("yyy") + "\" + $changeDate.ToString("MM") + "\" + $changeDate.ToString("dd") if([Directory]::Exists($createFolder)){ #Continue }else{ [Directory]::CreateDirectory($createFolder) } } } try{ $copyFile = [Path]::Combine($createFolder,$tempFile.name) $tempFile.CopyTo($copyFile) }catch{ Write-Warning "$copyFile already exists." } try{ #source File - ARW $sourceRawFile = [Path]::Combine($tempFile.DirectoryName,($tempFile.BaseName + $targetRawExtension)) #target File - ARW $targetRawFile = [Path]::Combine($createFolder,($tempFile.baseName + $targetRawExtension)) $tempRaw = [FileInfo]::new($sourceRawFile) if([file]::Exists($targetRawFile)){ Write-Warning "$targetRawFile already exists." }else{ $tempRaw.CopyTo($targetRawFile) } }catch{ Write-Error "$sourceRawFile some error occurred." } }
コメントを残す