
このスクリプトを使って、データ消失などが発生した場合でも、当方では、責任が持てませんので、利用される場合は、事前にバックアップを行ってご利用ください。また、サポートや質問を送っていただいても、お答えできませんので、ご了承ください。
メモリーから、コピーするときに、わざわざ重いソフトを立ち上げて、コピーする、もちろん、取り込みを考えると、いろいろ出来るし、便利なんだけど、でも、複数のソフトを使っている身とすれば、単純に、メモリーから特定のフォルダーにコピーするだけなのに・・・
ネットをいろいろ探して、実際使ってみても、コピー完了!とか表示されても出来てなかったり、余分な機能はあるんだけど、設定が作った人はわかりやすいのかもしれないけど、使う立場に立つと、良くわからなかったり、結局、無いという結論。
なら、作るしかないかと、作ったのがこれ。
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."
}
}
コメントを残す