對于檔案(照片)串列,我正在嘗試檢查它們是否具有來自相機的 EXIF 資訊,并且僅進一步處理不是來自相機的照片。我以為我會檢查 CameraModel EXIF 道具是否為空白,但我被卡住了。
我有這個代碼:
$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 | Select "CameraModel")
Write-Host $($camModel | Select-Object -Property "CameraModel")
}
}
Get-FileMetaData 從這里https://evotec.xyz/getting-file-metadata-with-powershell-similar-to-what-windows-explorer-provides/中途。
這回傳
DSC_0132.JPG
@{CameraModel=NIKON D80}
ScannedImage001.JPG
@{CameraModel=}
我的問題是,如何檢查這是否為空白,如底部結果所示@{CameraModel=}?實際上是什么@{CameraModel=}意思?有什么@{}寓意?
編輯:謝謝@mlkement0!
我的最終腳本如下,它將非相機 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)
}
}
}
uj5u.com熱心網友回復:
一般幾點:
Write-Host通常是使用錯誤的工具,除非意圖是僅寫入顯示,繞過成功輸出流,并且能夠將輸出發送到其他命令,將其捕獲到變數中,或將其重定向到檔案。要輸出一個值,請單獨使用它;例如,,$value而不是(或使用,但很少需要);看到這個答案。要僅顯式列印到顯示幕但格式豐富,請使用.Write-Host$valueWrite-Output$valueOut-Host因此,要獲得正確的輸出格式,只需使用
$_.Nameand$camModel | Select-Object -Property "CameraModel"as-is -no need forWrite-Hostor evenWrite-Output,這是隱含的. 如果您只需要相機型號值,請使用-ExpandProperty而不是Property.
至于你的具體問題:
如何檢查這是否為空白,如底部結果所示
@{CameraModel=}
$md = Get-FileMetaData -File $_.FullName
# Just use property access to get the camera model *value*.
# If no such property exists, $null is returned
# (except if Set-StrictMode -Version 2 or above is in effect).
$camModel = $md.CameraModel
if ($camModel -like '' {
"Camera model is $null or the empty string."
}
實際上是什么
@{CameraModel=}意思?有什么@{}寓意?
這種類似哈希表的表示與實際的哈希表無關,也不適用于程式處理。
當實體(例如由 創建的實體)被強制轉換為字串時(例如在您使用時), PowerShell 會使用此用于顯示的表示形式- 請參閱此答案以獲取更多資訊。[pscustomobject]Select-ObjectWrite-Host
可選閱讀:使用Select-Objectwith-ExpandProperty提取屬性值時的陷阱:
上述解決方案使用簡單的屬性訪問(點表示法)來獲取$md物件.CameraModel屬性的值,即$md.CameraModel
這種語法上簡單的方法甚至在直接應用于包含在 中的運算式和命令時(...),甚至當被操作的物件是物件的集合時,由于稱為成員訪問列舉的特性);例如,在以下示例.Year中,輸入物件的屬性值以陣列( [object[]]) 的形式回傳:
((Get-Date), (Get-Date).AddYears(1)).Year # e.g. -> @(2022, 2023)
如果無論如何要在記憶體中收集回傳值,則沒有充分的理由通過 - 總是較慢-Select-Object -ExpandProperty呼叫來完成相同的任務;例如:
# Same result as above.
(Get-Date), (Get-Date).AddYears(1) | Select-Object -ExpandProperty Year
避免的另一個原因Select-Object -ExpandProperty是您發現的不一致:
與 with 不同-Property,對于碰巧沒有該屬性的任何輸入物件都會-ExpandProperty 報告錯誤;例如:
# -> Outputs 1, for the first object, but then emits an
# ERROR: 'Select-Object: Property "Prop" cannot be found.'
[pscustomobject] @{ Prop=1 }, [pscustomobject] @{ } |
Select-Object -ExpandProperty Prop
-Property相比之下,您將獲得一個實體[pscsutomobject],其.Prop值適用$null于任何沒有.Prop屬性的輸入物件 - 不會發生錯誤。這種令人驚訝的不一致是GitHub 問題 #18416的主題。
嚴格模式(Set-StrictMode)注意事項:
作為 cmdlet,
Select-Object不受有效的嚴格模式的影響:- 每個輸入物件
-ExpandProperty都會報告不存在的屬性發生的(意外)錯誤(因此是非終止錯誤),這意味著仍然會報告任何具有請求屬性的輸入物件的值。
- 每個輸入物件
相比之下,嘗試訪問不存在的屬性(使用
.,成員訪問運算子Set-StrictMode -Version 2)僅在或更高版本有效時才會導致錯誤:使用
.訪問不存在的屬性會導致陳述句終止錯誤,這意味著整個陳述句會立即終止,嘗試的屬性訪問不會產生(資料)輸出。由于這也適用于成員訪問列舉,因此即使某些輸入物件具有目標屬性,也沒有(資料)輸出- 不像 with ; 例如:
Select-Object -ExpandProperty# Set strict mode to a version that enforces property existence. Set-StrictMode -Version 2 # !! This ONLY produces an ERROR - it doesn't also output # !! 1, even though the first input object has a .Prop property. ([pscustomobject] @{ Prop=1 }, [pscustomobject] @{ }).Prop
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/523420.html
標籤:电源外壳
