ふっかちゃん

メモリーから写真コピーに困ったこと

このスクリプトを使って、データ消失などが発生した場合でも、当方では、責任が持てませんので、利用される場合は、事前にバックアップを行ってご利用ください。また、サポートや質問を送っていただいても、お答えできませんので、ご了承ください。

メモリーから、コピーするときに、わざわざ重いソフトを立ち上げて、コピーする、もちろん、取り込みを考えると、いろいろ出来るし、便利なんだけど、でも、複数のソフトを使っている身とすれば、単純に、メモリーから特定のフォルダーにコピーするだけなのに・・・

ネットをいろいろ探して、実際使ってみても、コピー完了!とか表示されても出来てなかったり、余分な機能はあるんだけど、設定が作った人はわかりやすいのかもしれないけど、使う立場に立つと、良くわからなかったり、結局、無いという結論。

なら、作るしかないかと、作ったのがこれ。
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."
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です