windows 11 一次性大量修改照片名稱,透過 PowerShell 讀取照片 Exif 資訊 # Windows PowerShell

1. 首先將照片集中到統一的資料夾

2. 在同一個資料夾下,右鍵新增一個文字文件

3. 命名為 exif-datetaken,名字可以更改,後面會需要用到檔名

功能為取出照片 Exif 資訊

4. 將以下這一段程式碼,複製貼上到 .txt 檔,並且儲存,內容不需要另外做修改

param([string]$file)
function GetTakenData($image) {
try {
return $image.GetPropertyItem(36867).Value
}
catch {
return $null
}
}
[Reflection.Assembly]::LoadFile('C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Drawing.dll') | Out-Null
$image = New-Object System.Drawing.Bitmap -ArgumentList $file
try {
$takenData = GetTakenData($image)
if ($takenData -eq $null) {
return $null
}
$takenValue = [System.Text.Encoding]::Default.GetString($takenData, 0, $takenData.Length - 1)
$taken = [DateTime]::ParseExact($takenValue, 'yyyy:MM:dd HH:mm:ss', $null)
return $taken
}
finally {
$image.Dispose()
}

保存文件 .txt

5. 將檔案重新命名,修改副檔名成 .ps1

如果只有修改成 .ps1 可能是錯誤的,需要確認副檔名是 .ps1,而不是 .ps1.txt

開啟顯示副檔名

修改副檔名

副檔名為 .ps1.txt 是錯誤的

成功後圖示會顯示不同

內容會顯示為 Windows PowerShell 指令碼

6. 接著要確認照片要怎麼命名

首先照片的命名格式為  

第一種 : 鋼鐵人_yyyyMMdd-HHmmss.jpg 的格式

第二種 : 按照index順序累加的格式

Ex:
20220319-100.jpg
20220319-101.jpg
20220319-102.jpg

做這一步之前需要開啟 開始畫面 搜尋 powershell

點選 Windows PowerShell ISE 顯示為藍色視窗

輸入 get-executionpolicy

如果顯示為 Restricted 那麼需要接著輸入 

set-executionpolicy remotesigned

系統會詢問點選 "是" 即可

會跳出錯誤提示

可以再 開始 或 Windows Power Shell ISE(x86) 檔案位置,以系統管理員身分開啟檔案

以系統管理員身分執行後即可成功設定

修改檔名成功,後續該如何還原(此步驟等最後修改檔名完成後再做)

輸入 set-executionpolicy restricted

點選是就可以還原成最初的狀態

比較困難的部分

按住 Shift 點選右鍵,選擇在這裡開啟 PowerShell 視窗

7.1 第一種命名的方法

需要注意開啟 powershell 的路徑是照片資料夾的路徑,且步驟 5 產生的exif-datetaken.ps1檔案也在同一個路徑下

輸入

Get-ChildItem *.jpg | ForEach {
  $date = (.\exif-datetaken.ps1 $_.FullName)
  if ($date -eq $null) {
    Write-Host $_.Name ' 錯誤:找不到拍攝日期資訊。'
    return
  }
  $fileName = $date.ToString('鋼鐵人_yyyyMMdd-HHmmss') + '.jpg'
  Rename-Item -Path $_.Name -NewName $fileName
  Write-Host "舊檔名: " $_.Name " => 新檔名: " $fileName
}

*紅色的部分為步驟 5 產生的檔名

*藍色的部分為需要修改檔案的副檔名,如果是 .png 或 .jpg 需要對應修改 

*綠色的部分可自行修改

如果跳出錯誤請重新確認步驟 6 是否設定正確,或藍色部分檔名是否有對應

修改完成會顯示相關資訊


已經按照時間修改成對應檔案名稱

7.2 第二種命名方法(按照index順序累加)

Get-ChildItem *.jpg | ForEach {
  $date = (.\exif-datetaken.ps1 $_.FullName)
  if ($date -eq $null) {
    Write-Host $_.Name ' 錯誤:找不到拍攝日期資訊。'
    return
  }
  $index = 100
  do {
    $fileName = $date.ToString('yyyyMMdd') + ('-{0:00}' -f $index++) + '.jpg'
  } while (Test-Path -Path $fileName -PathType leaf)
  Rename-Item -Path $_.Name -NewName $fileName
  Write-Host "舊檔名: " $_.Name " => 新檔名: " $fileName
}

*紅色 index 的起始可以自行設定

*綠色的部分可自行修改

執行結果

修改結果

後記

如果這篇文章對於你有幫助,可以幫忙分享給更多的人.文章內容如果有誤,可以在下方留言告知.本網站主要提供程式, 玩具相關資訊,可以訂閱獲得最即時的資訊.

留言

熱門文章

Google Play Console 2022 上架資訊,審核通過時間

如何創造出難以維護的程式碼

2021申請 Android Developer 開發者帳號及上架步驟