בכל פעם שאתם מצלמים תמונה, המצלמה שלכם רושמת לקובץ לא רק את התמונה עצמה, אלא גם מידע שירות: דגם המצלמה והעדשה, תאריך ושעת הצילום, מהירות תריס, צמצם, ISO, קואורדינטות GPS. נתונים אלו נקראים **EXIF (Exchangeable Image File Format)**.
אף של-PowerShell יש כלים מובנים לקריאת חלק מהמטא-נתונים, הם מוגבלים. כדי לגשת ל**כל** המידע, נדרש כלי מיוחד. במאמר זה אשתמש ב-**ExifTool**.
**ExifTool** הוא כלי עזר חינמי, חוצה פלטפורמות, בקוד פתוח, שנכתב על ידי פיל הארווי. הוא נחשב לסטנדרט הזהב לקריאה, כתיבה ועריכה של מטא-נתונים במגוון רחב של פורמטים (תמונות, אודיו, וידאו, PDF ועוד). ExifTool מכיר אלפי תגים ממאות יצרני מכשירים, מה שהופך אותו לכלי המקיף ביותר בקטגוריה שלו.
- הורדה והגדרה נכונה
- PowerShell ותוכניות חיצוניות
- טריקים מעשיים: ExifTool + PowerShell
- דוגמה מס' 1: חילוץ בסיסי וצפייה אינטראקטיבית
- דוגמה מס' 2: יצירת דוח נקי ושליחה ל"התקנים" שונים
- דוגמה מס' 3: קבלת נתונים ספציפיים לשימוש בסקריפט
- דוגמה מס' 4: חילוץ אצווה של מטא-נתונים מתיקיה
- דוגמה מס' 5: חיפוש רקורסיבי בתיקיות משנה
- דוגמה מס' 6: שינוי שמות קבצים לפי תאריך צילום
- דוגמה מס' 7: חילוץ קואורדינטות GPS בלבד
- דוגמה מס' 8: מחיקה המונית של כל נתוני GPS (לצורך פרטיות)
- דוגמה מס' 9: המרת זמן צילום לזמן מקומי
- דוגמה מס' 10: קבלת רשימה של כל דגמי המצלמות הייחודיים בתיקיה
- דוגמה מס' 11: הצגת תגים נחוצים בלבד בפורמט טבלאי
- דוגמה מס' 12: בדיקת נוכחות GPS במערך גדול של קבצים
- דוגמה מס' 13: העתקת מטא-נתונים מקובץ אחד לאחר
- דוגמה מס' 14: שמירת מטא-נתונים מקוריים לקובץ JSON נפרד לפני שינוי
- דוגמה מס' 15: שימוש ב-PowerShell למיון אוטומטי של תמונות לפי תאריך
- דוגמה 16: מציאת כל דגמי המצלמות הייחודיים באוסף
הורדה והגדרה נכונה
לפני כתיבת קוד כלשהו, יש להכין את כלי העזר עצמו.
- היכנסו ל**אתר הרשמי של ExifTool: https://exiftool.org/**. בעמוד הראשי, מצאו והורידו את **"Windows Executable"**.
- שינוי שם (שלב קריטי!): הקובץ שהורדתם ייקרא
exiftool(-k).exe
. זו לא מקריות. שנו את שמו ל-**exiftool.exe
**, כדי **לבטל את מצב ה"השהיה"**, המיועד למשתמשים המפעילים את התוכנה בלחיצה כפולה. - אחסון: יש לכם שתי אפשרויות עיקריות היכן לאחסן את
exiftool.exe
.- אפשרות 1 (פשוטה): באותה תיקיה כמו הסקריפט שלכם. זו הדרך הקלה ביותר. סקריפט ה-PowerShell שלכם תמיד יוכל למצוא את כלי העזר, מכיוון שהוא נמצא בסמוך. אידיאלי לסקריפטים ניידים שאתם מעבירים ממחשב למחשב.
- אפשרות 2 (מומלצת לשימוש תכוף): בתיקיה מתוך משתנה המערכת
PATH
. משתנהPATH
הוא רשימת ספריות שבהן Windows ו-PowerShell מחפשים אוטומטית קבצי הפעלה.
אתם יכולים ליצור תיקיה (לדוגמה,C:\Tools
), לשים בה אתexiftool.exe
ולהוסיף אתC:\Tools
למשתנה המערכתPATH
.
לאחר מכן תוכלו להפעיל אתexiftool.exe
מכל תיקיה בכל קונסולה.
סקריפטים להוספה ל-$PATH
:
הוספת ספרייה ל-PATH
עבור המשתמש הנוכחי
הוספת ספרייה ל-PATH
המערכתי עבור כל המשתמשים
PowerShell ותוכניות חיצוניות
כדי להשתמש ב-ExifTool ביעילות, יש לדעת כיצד PowerShell מפעיל קבצי .exe
חיצוניים.
הדרך הנכונה והאמינה ביותר להפעלת תוכניות חיצוניות היא **אופרטור הקריאה &
(אמפרסנד)**.
PowerShell יחזיר שגיאה במקרה שנתיב התוכנית מכיל רווחים. לדוגמה, C:\My Tools\exiftool.exe
.&
(אמפרסנד) אומר ל-PowerShell: "הטקסט שאחרי בגרשיים, – זהו הנתיב לקובץ ההפעלה. הפעל אותו, וכל מה שאחריו, – אלו הארגומנטים שלו".
# תחביר נכון
& "C:\Path With Spaces\program.exe" "argument 1" "argument 2"
תמיד השתמשו ב-&
, כאשר אתם עובדים עם נתיבים לתוכניות במשתנים או נתיבים שעשויים להכיל רווחים.
טריקים מעשיים: ExifTool + PowerShell
כעת נשלב את הידע שלנו.
דוגמה מס' 1: חילוץ בסיסי וצפייה אינטראקטיבית
הדרך הפשוטה ביותר לקבל את כל הנתונים מתמונה ולבחון אותם – היא לבקש אותם בפורמט JSON ולהעביר אותם ל-Out-ConsoleGridView
.
$photoPath = "D:\Photos\IMG_1234.JPG"
# 1. מפעילים את exiftool עם המתג -json לפלט מובנה
# 2. ממירים את טקסט ה-JSON לאובייקט PowerShell
# מפעילים את exiftool.exe ישירות, ללא משתנה ואופרטור קריאה &.
$exifObject = exiftool.exe -json $photoPath | ConvertFrom-Json
# 3. הופכים את האובייקט ה"רחב" לטבלת "פרמטר-ערך" נוחה
$reportData = $exifObject.psobject.Properties | Select-Object Name, Value
# 4. מציגים את התוצאה בחלון אינטראקטיבי לניתוח
$reportData | Out-ConsoleGridView -Title "מטא-נתונים של קובץ: $($photoPath | Split-Path -Leaf)"
קוד זה יפתח חלון אינטראקטיבי שבו תוכלו למיין נתונים לפי שם פרמטר או ערך, ולסנן אותם, פשוט על ידי התחלת הקלדת טקסט. זה נוח להפליא למציאת מידע נחוץ במהירות.
דוגמה מס' 2: יצירת דוח נקי ושליחה ל"התקנים" שונים
Out-ConsoleGridView
– זו רק ההתחלה. אתם יכולים להפנות נתונים מעובדים לכל מקום, באמצעות פקודות Out-*
אחרות.
נניח שיש לנו נתונים במשתנה $reportData
מהדוגמה הקודמת.
**א) שליחה לקובץ CSV עבור Excel**
$reportData | Export-Csv -Path "C:\Reports\photo_exif.csv" -NoTypeInformation -Encoding UTF8
הפקודה Export-Csv
יוצרת קובץ מובנה באופן מושלם שניתן לפתוח ב-Excel או ב-Google Sheets.
**ב) שליחה לקובץ טקסט**
# לעיצוב יפה, השתמשו תחילה ב-Format-Table
$reportData | Format-Table -AutoSize | Out-File -FilePath "C:\Reports\photo_exif.txt"
הפקודה Out-File
תשמור לקובץ עותק טקסט מדויק של מה שאתם רואים בקונסולה.
**ג) שליחה ללוח הגזירים**
רוצים להדביק נתונים במהירות למייל או לצ'אט? השתמשו ב-Out-Clipboard
.
$reportData | Format-Table -AutoSize | Out-String | Out-Clipboard
כעת תוכלו ללחוץ Ctrl+V
בכל עורך טקסט ולהדביק טבלה מעוצבת בקפידה.
דוגמה מס' 3: קבלת נתונים ספציפיים לשימוש בסקריפט
לעתים קרובות אינכם זקוקים לכל הדוח, אלא רק לערך אחד או שניים. מכיוון ש-$exifObject
– זהו אובייקט PowerShell רגיל, תוכלו לגשת בקלות למאפייניו.
$photoPath = "D:\Photos\IMG_1234.JPG"
# מפעילים את exiftool.exe ישירות לפי שם.
# PowerShell ימצא אותו אוטומטית באחת מהתיקיות, המפורטות ב-PATH.
$exifObject = exiftool.exe -json $photoPath | ConvertFrom-Json
# 1. יוצרים אובייקט PowerShell אחד עם שמות מאפיינים מובנים.
# זה דומה ליצירת רשומה מובנית.
$reportObject = [PSCustomObject]@{
"מצלמה" = $exifObject.Model
"תאריך צילום" = $exifObject.DateTimeOriginal
"רגישות" = $exifObject.ISO
"שם קובץ" = $exifObject.FileName # נוסיף את שם הקובץ להקשר
}
# 2. מציגים את האובייקט הזה בחלון אינטראקטיבי.
# Out-GridView תיצור אוטומטית עמודות משמות המאפיינים.
$reportObject | Out-ConsoleGridView -Title "מטא-נתונים של קובץ: $(Split-Path $photoPath -Leaf)"
גישה זו היא הבסיס לכל אוטומציה רצינית, כגון שינוי שמות קבצים על בסיס תאריך הצילום, מיון תמונות לפי דגם מצלמה או הוספת סימני מים עם מידע על חשיפה.
דוגמה מס' 4: חילוץ אצווה של מטא-נתונים מתיקיה
לפעמים צריך לנתח לא תמונה אחת, אלא תיקיה שלמה עם תמונות.
# מציינים רק את תיקיית התמונות.
$photoFolder = "D:\Photos"
# מפעילים את exiftool.exe ישירות. משתנה לנתיב ואופרטור & אינם נחוצים.
$allExif = exiftool.exe -json "$photoFolder\*.jpg" | ConvertFrom-Json
# הופכים לתצוגה נוחה
$report = foreach ($photo in $allExif) {
[PSCustomObject]@{
# --- נתונים בסיסיים על הקובץ והמצלמה ---
FileName = $photo.FileName
DateTime = $photo.DateTimeOriginal
CameraMake = $photo.Make # יצרן (לדוגמה, "Canon", "SONY")
CameraModel = $photo.Model # דגם מצלמה (לדוגמה, "EOS R5")
LensModel = $photo.LensID # שם מלא של דגם העדשה
# --- פרמטרי צילום (חשיפה) ---
ISO = $photo.ISO
ShutterSpeed = $photo.ShutterSpeed
Aperture = $photo.Aperture
FocalLength = $photo.FocalLength # אורך מוקד (לדוגמה, "50.0 mm")
ExposureMode = $photo.ExposureProgram # מצב צילום (לדוגמה, "Manual", "Aperture Priority")
Flash = $photo.Flash # מידע האם הפלאש הופעל
# --- GPS ונתוני תמונה ---
GPSPosition = $photo.GPSPosition # קואורדינטות GPS כמחרוזת אחת (אם קיימות)
Dimensions = "$($photo.ImageWidth)x$($photo.ImageHeight)" # מימדי תמונה בפיקסלים
}
}
# מציגים נתונים בטבלה אינטראקטיבית בקונסולה
$report | Out-ConsoleGridView -Title "דוח סיכום לתיקיה: $photoFolder"
💡 אתם מקבלים טבלה מסודרת לכל התיקיה בבת אחת.
דוגמה מס' 5: חיפוש רקורסיבי בתיקיות משנה
ExifTool יודע לחפש קבצים בכל תיקיות המשנה בעצמו בעת שימוש במתג -r
.
& $exifToolPath -r -json "D:\Photos" | ConvertFrom-Json |
Select-Object FileName, Model, DateTimeOriginal |
Export-Csv "C:\Reports\all_photos_recursive.csv" -NoTypeInformation -Encoding UTF8
דוגמה מס' 6: שינוי שמות קבצים לפי תאריך צילום
זהו אחד מתרחישי האוטומציה הפופולריים ביותר – קבצים מקבלים שמות לפי תאריך/שעת הצילום.
$exifToolPath = "C:\Tools\exiftool.exe"
$photoFolder = "D:\Photos"
# נשנה שם לפורמט YYYY-MM-DD_HH-MM-SS.jpg
& $exifToolPath -r -d "%Y-%m-%d_%H-%M-%S.%%e" "-FileName<DateTimeOriginal" $photoFolder
💡 *ExifTool יכניס אוטומטית את סיומת הקובץ המקורית באמצעות %%e
.*
דוגמה מס' 7: חילוץ קואורדינטות GPS בלבד
שימושי אם אתם רוצים לבנות מפה מהתמונות שלכם.
# 1. ציינו את הנתיב לתיקיה עם התמונות שלכם
$photoFolder = "E:\DCIM\Camera"
# 2. מפרטים את התגים שאנו צריכים: שם קובץ ושלושה תגי GPS.
# זה הופך את השאילתה למהירה הרבה יותר מאשר אם היינו מאחזרים את כל התגים.
$tagsToExtract = @(
"-SourceFile", # SourceFile עדיף על FileName, מכיוון שהוא בדרך כלל מכיל את הנתיב המלא
"-GPSLatitude",
"-GPSLongitude",
"-GPSAltitude"
)
# 3. מפעילים את exiftool.exe ישירות (מכיוון שהוא ב-PATH).
# המתג -r מחפש קבצים בכל תיקיות המשנה.
# התוצאה מומרת מיד מ-JSON.
$allExifData = exiftool.exe -r -json $tagsToExtract $photoFolder | ConvertFrom-Json
# 4. מסננים את התוצאות: משאירים רק את האובייקטים שיש להם קו רוחב וקו אורך.
$filesWithGps = $allExifData | Where-Object { $_.GPSLatitude -and $_.GPSLongitude }
# 5. בודקים אם בכלל נמצאו קבצים עם נתוני GPS
if ($filesWithGps) {
# 6. יוצרים דוח יפה מהנתונים המסוננים.
# משתמשים ב-Select-Object לשינוי שמות עמודות ועיצוב.
$report = $filesWithGps | Select-Object @{Name="שם קובץ"; Expression={Split-Path $_.SourceFile -Leaf}},
@{Name="קו רוחב"; Expression={$_.GPSLatitude}},
@{Name="קו אורך"; Expression={$_.GPSLongitude}},
@{Name="גובה"; Expression={if ($_.GPSAltitude) { "$($_.GPSAltitude) מ" } else { "N/A" }}}
# 7. מציגים את הדוח הסופי בטבלה אינטראקטיבית בקונסולה.
$report | Out-ConsoleGridView -Title "קבצים עם נתוני GPS בתיקיה: $photoFolder"
} else {
# אם לא נמצא דבר, מודיעים על כך בנימוס.
Write-Host "קבצים עם נתוני GPS בתיקיה '$photoFolder' לא נמצאו." -ForegroundColor Yellow
}
דוגמה מס' 8: מחיקה המונית של כל נתוני GPS (לצורך פרטיות)
# נמחק את כל תגי ה-GPS מקבצי JPG ו-PNG
& $exifToolPath -r -overwrite_original -gps:all= "D:\Photos"
💡 *פעולה זו בלתי הפיכה, לכן גבו את הקבצים לפני הביצוע.*
דוגמה מס' 9: המרת זמן צילום לזמן מקומי
לפעמים תמונות צולמו באזור זמן אחר. ExifTool יכול להזיז את התאריך.
# מזיזים את הזמן ב-3 שעות
& $exifToolPath "-AllDates+=3:0:0" "D:\Photos\IMG_*.JPG"
דוגמה מס' 10: קבלת רשימה של כל דגמי המצלמות הייחודיים בתיקיה
$models = & $exifToolPath -r -Model -s3 "D:\Photos" | Sort-Object -Unique
$models | ForEach-Object { Write-Host "דגם: $_" }
דוגמה מס' 11: הצגת תגים נחוצים בלבד בפורמט טבלאי
& $exifToolPath -T -Model -DateTimeOriginal -ISO -Aperture -ShutterSpeed "D:\Photos\IMG_1234.JPG"
-T
מציג פלט בפורמט טבלאי, מופרד בטאבים – נוח לעיבוד נוסף.
דוגמה מס' 12: בדיקת נוכחות GPS במערך גדול של קבצים
$files = & $exifToolPath -r -if "$gpslatitude" -p '$FileName' "D:\Photos"
Write-Host "קבצים עם GPS:"
$files
דוגמה מס' 13: העתקת מטא-נתונים מקובץ אחד לאחר
# 1. בוחרים קובץ ייחוס
$sourceFile = Get-ChildItem "D:\Photos" -Filter "*.jpg" | Out-ConsoleGridView -Title "בחרו קובץ ייחוס"
# 2. אם קובץ ייחוס נבחר, בוחרים קבצי יעד
if ($sourceFile) {
$targetFiles = Get-ChildItem "D:\Photos\New" -Filter "*.jpg" | Out-ConsoleGridView -Title "בחרו קבצי יעד להעתקת מטא-נתונים" -OutputMode Multiple
# 3. אם קבצי יעד נבחרו, מבצעים את ההעתקה
if ($targetFiles) {
& exiftool.exe -TagsFromFile $sourceFile.FullName ($targetFiles.FullName)
Write-Host "מטא-נתונים הועתקו מ-$($sourceFile.Name) ל-$($targetFiles.Count) קבצים."
}
}
דוגמה מס' 14: שמירת מטא-נתונים מקוריים לקובץ JSON נפרד לפני שינוי
$backupPath = "C:\Reports\metadata_backup.json"
& $exifToolPath -r -json "D:\Photos" | Out-File -Encoding UTF8 $backupPath
דוגמה מס' 15: שימוש ב-PowerShell למיון אוטומטי של תמונות לפי תאריך
$photos = Get-ChildItem "D:\Photos" -Filter *.jpg -Recurse
foreach ($photo in $photos) {
$meta = & $exifToolPath -json $photo.FullName | ConvertFrom-Json
$date = Get-Date $meta.DateTimeOriginal -ErrorAction SilentlyContinue
if ($date) {
$targetFolder = "D:\Sorted\{0:yyyy}\{0:MM}" -f $date
if (-not (Test-Path $targetFolder)) { New-Item -Path $targetFolder -ItemType Directory }
Move-Item $photo.FullName -Destination $targetFolder
}
}
דוגמה 16: מציאת כל דגמי המצלמות הייחודיים באוסף
אף שניתן לעשות זאת בשורה אחת, הצגה ב-GridView
מאפשרת להעתיק מיד את שם הדגם הרצוי.
# המתג -s3 מציג רק ערכים, -Model - את שם התג
$uniqueModels = & exiftool.exe -r -Model -s3 "D:\Photos" | Sort-Object -Unique
# מציגים ב-GridView לצפייה והעתקה נוחות
$uniqueModels | Out-ConsoleGridView -Title "דגמי מצלמות ייחודיים באוסף"