PowerShell中@{CameraModel=}含义解析及非相机拍摄JPG照片筛选处理技术问询
关于PowerShell中EXIF相机型号判断的问题解答
问题1:@{CameraModel=}和@{}的含义
在PowerShell里,你看到的@{CameraModel=}其实是自定义对象的默认输出格式,用来直观展示对象的属性与对应值:
@{}本身是PowerShell创建哈希表(Hashtable)的字面量语法,但这里的场景是:当你用Select-Object CameraModel时,会返回一个仅包含CameraModel属性的自定义对象,PowerShell输出这类对象时就会用@{PropertyName=PropertyValue}的格式呈现。@{CameraModel=}表示这个对象的CameraModel属性值为空(可能是$null或者空字符串),而@{CameraModel=NIKON D80}则表示该属性有具体的相机型号值。
你之前代码里连续两次使用Select操作(先$md | Select "CameraModel"再Select-Object -Property "CameraModel")是多余的,这会让你拿到的是包含属性的对象,而非属性的实际值——这也是你看到这种特殊格式的直接原因。
问题2:如何判断CameraModel为空并筛选照片
要正确判断相机型号是否为空,你需要直接获取CameraModel属性的实际值,再通过PowerShell的条件逻辑筛选目标照片:
核心判断逻辑
- 直接从元数据对象中提取属性值:
$camModel = $md.CameraModel - 判断值是否为空,推荐几种可靠方式:
- 同时处理
$null和空字符串:if ([string]::IsNullOrEmpty($camModel)) - 简洁布尔判断(空字符串、
$null在PowerShell中会被视为$false):if (-not $camModel) - 直接匹配空字符串:
if ($camModel -eq '')
- 同时处理
你的最终优化脚本(已验证可用)
你完成的脚本完美实现了需求——将非相机拍摄的JPG文件的创建时间和修改时间统一设置为文件夹名称对应年份的1月1日,这里贴出来方便参考:
$scriptpath = $MyInvocation.MyCommand.Path $dir = Split-Path $scriptpath Write-Host $dir Invoke-Expression -Command $($dir + "\Get-FileMetaData.ps1") Get-ChildItem -Path $dir -Directory | Foreach-Object { $date_str = $_.Name + '-01-01 00:00:00' $date = $(Get-Date -Date $date_str) Write-Host $_.FullName Get-ChildItem -Path $_.FullName -Filter "*.jpg" | Foreach-Object { Write-Host $_.Name $md = Get-FileMetaData -File $_.FullName $camModel = $md.CameraModel if ($camModel -like ''){ $(get-item $_.FullName).CreationTime = $date $(get-item $_.FullName).LastWriteTime = $date Write-Host ("Set date to " + $date) } } }
小优化建议
可以把if ($camModel -like '')替换为if ([string]::IsNullOrEmpty($camModel)),这样能同时兼容$null和空字符串两种空值情况,鲁棒性更强。
内容的提问来源于stack exchange,提问作者njminchin




