Exifから名前を変更する.ps1

Exifから名前を変更する.ps1

さまざまなカメラで撮影した写真のフォルダがあり、これらの写真はすべて正しい日付時刻オリジナルEXIFタグセット。

次のようなファイルのリストがあるとします。

20150831_153712.jpg
IMG_5246.JPG
IMG_5247.JPG
20150902_201425.jpg

さて、私はこれらのファイルをこのように名前変更する方法を知りたいのですが、日付時刻オリジナルもちろんタグ:

001_IMG_5246.JPG
002_20150831_153712.jpg
003_IMG_5247.JPG
004_20150902_201425.jpg

基本的に私はexifツール(直接実行できない場合はWindowsのバッチプログラムを使用する)選別JPEGのフォルダ全体日付時刻オリジナル昇順で名前を変更すると、カウンターファイル名の前にプレフィックスを付けます (元のファイル名は保持されます)。

また、名前変更をプレビューするテストコマンドそれが起こる前に(何かが間違っているかどうかを確認するために、テスト名鬼ごっこ)。

答え1

ExifTool で使用するアイテムは、-FileOrderオプションとFileSequenceタグ、および高度なフォーマット オプションを使用する Perl のちょっとした部分です。FileOrder オプションは、オプションでリストした時間に基づいてファイルを並べ替えます。これにより、各ファイルを 2 回読み取る必要があるため、ExifTool の速度が少し低下しますが、ループして各ループで ExifTool を呼び出すなどの他のオプションよりは通常高速です。FileSequence タグは ExifTool の内部にあり、現在処理中のファイルの番号を追跡します。これは 0 から始まるため、高度な処理では 1 を追加する必要があります。また、少なくとも 3 文字になるように、ゼロを埋め込む場所でもあります。

次のコマンドを試してください:
ExifTool "-TestName<${FileSequence;$_=0 x(3-length($_+1)).($_+1)}_$filename" -FileOrder DateTimeOriginal DIR

動作するなら、次の-TestNameように置き換えてください-FileName:
ExifTool "-FileName<${FileSequence;$_=0 x(3-length($_+1)).($_+1)}_$filename" -FileOrder DateTimeOriginal DIR

埋め込むゼロの数を変更するには、 の 3 を3-length希望する数値に変更します。開始数を変更するには、 の 1 を変更します$_+1

答え2

いくつかの名前変更ツールを試してみました。主な問題は、次のようなツールです。マスターの名前を変更そしてExifツールEXIF データにアクセスできます。しかし、番号付きリストを生成する方法が見つかりませんでした。

そこで、これを実行するための PowerShell スクリプトを作成しました。各行にコメントを付けました。簡単に理解できるはずです。読んでみてください。

まず最初にやらなければならなかったのは、「DateTimeOriginal」のIDを使用できるようになりますGetPropertyItem(MyExifID)。次に、指定されたフォルダーから、実際に DateTimeOriginal を持つすべての画像を配列に追加します。ここからは簡単です。配列を日付列で並べ替え、単純なカウンターを増分し、パターンを使用して新しいファイル名を作成します000_oldname

このスクリプトは何も変更しません。次のようなものだけが出力されます:

ここに画像の説明を入力してください

これを使用して、スクリプトが何を実行するかを確認します。考えられる結果を確認したら、#行の前のコメント インジケータを削除します#Rename-Item $_[0].Fullname $newName今後は、スクリプトによってファイル名が適宜変更されます。

Exifから名前を変更する.ps1

# Set image folder to process
$strDirectory = "T:\Pictures"

# Create empty array
$arrSortMe = @()

# Load Windows library to access EXIF data
[void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")

# Loop through all JPGs and JPEGs in the given image folder
Get-ChildItem -Path "$strDirectory\*" -Include *.jpg,*.jpeg | ForEach {

  # Load current image into Powershell as bitmap object
  $img = New-Object -TypeName system.drawing.bitmap -ArgumentList $_.FullName

  # Error handling for images which doesn't have the specified EXIF data
  Try {

    # Get EXIF data with ID 36867 - which is "DateTimeOriginal"
    $intExif = [Byte[]]$img.GetPropertyItem(36867).Value

    # Release image or else later we can't rename it
    $img.Dispose()

    # Convert EXIF data from byte array to string
    $strExif = [System.Text.Encoding]::Default.GetString($intExif, 0, $intExif.Length-1)

    # Convert EXIF data from string to datetime
    $dateExif = [DateTime]::ParseExact($strExif, 'yyyy:MM:dd HH:mm:ss', $null)

    # Add to multidimensional array: [0]=current_file  and [1]=datetime
    $arrSortMe += ,@($_, $dateExif)
  }
  Catch {}
}

Write-host "DateTimeTaken" `t`t`t "New Name" `t`t`t "Old Fullname"
# Sort array by datetime and pipe the sorted array to a foreach loop
$arrSortMe | Sort-Object @{Expression={$_[1]} } | ForEach {$i=0}{

    # Increment a simple counter starting with 0, so the first image gets the "1"
    $i++

    # Format the counter to 3-digits, append an underscore followed by the old image name
    $newName =  $i.ToString("000") + "_" + $_[0].Name    

    # Don't rename images which already have three digits as filename start
    If ($_.Name -notmatch "^[\d]{3}_") {
        #Rename-Item $_[0].Fullname $newName
    }

    # Only for debugging    
    Write-host $_[1].Date `t $newName `t $_[0].Fullname
}

# Clear all variables. System variables are readonly so we don't mind using * to get all
Remove-Variable * -ErrorAction SilentlyContinue

使用されたリソース

関連情報