You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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的条件逻辑筛选目标照片:

核心判断逻辑

  1. 直接从元数据对象中提取属性值:$camModel = $md.CameraModel
  2. 判断值是否为空,推荐几种可靠方式:
    • 同时处理$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

火山引擎 最新活动