PowerShell: 詳細情報から取得した日付のフォーマット
ファイルのプロパティ詳細情報の撮影日時(ID:12)と取得日時(ID:129)を取って日付フォーマットを変えるときに=DateTimeオブジェクトにする時にエラーが出る。
Get-Dateでも[System.DateTime]::Now(短縮[DateTime])でもエラーが出る。
原因は撮影日時(ID:12)と取得日時(ID:129)の日付には何かの制御文字が入っているのでDateTimeオブジェクト規則から外れるようです。
とりあえず正規表現を使いこの制御文字を外します。
サンプルスクリプト
Get-Dateでも[System.DateTime]::Now(短縮[DateTime])でもエラーが出る。
Get-Date : パラメーター 'Date' をバインドできません。値 "2017/01/07 9:11" を型 "System.DateTime" に変換できません。エラー: "文字列は有効な DateTime ではありませんでした。"
発生場所 C\:詳細情報から取得した日付のフォーマット.ps1:41 文字:10
+ Get-Date $date_org
+ ~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-Date]、ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetDateCommand
値 "2017/01/07 9:11" を型 "System.DateTime" に変換できません。エラー: "文字列は有効な DateTime ではありませんでした。"
発生場所 C\:詳細情報から取得した日付のフォーマット.ps1:43 文字:1
+ [DateTime]$date_org
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) []、RuntimeException
+ FullyQualifiedErrorId : InvalidCastParseTargetInvocationWithFormatProvider
原因は撮影日時(ID:12)と取得日時(ID:129)の日付には何かの制御文字が入っているのでDateTimeオブジェクト規則から外れるようです。
とりあえず正規表現を使いこの制御文字を外します。
$pat = "(\d{4}).*?(\d{1,2}).*?(\d{1,2}).*?(\d{1,2}.*?$)"
$regex = [regex]$pat
$hash_table = $regex.Matches($date_org)
$hash_table
$array = $hash_table.Groups
$date_new = [string]$array[1] + "-" + [string]$array[2] + "-" + [string]$array[3] + " " + [string]$array[4]
$date = Get-Date $date_new -Format "F"
サンプルスクリプト
# 詳細情報から取得した日付のフォーマット
# ファイルのフルパス
$path = "C:\test.jpg"
# フルパスを分割
$folder = Split-Path $path
$file = Split-Path $path -Leaf
#Write-Host ディレクトリーパス: $folder"`r`n"ファイル名: $file
# WSHオブジェクトを作成
$shell = New-Object -ComObject Shell.Application
# フォルダの指定
$shellFolder = $shell.NameSpace($folder)
# ファイルの指定
$shellFile = $shellFolder.parseName($file)
# 詳細プロパティの要約 -1を指定
#Write-Host $shellFolder.GetDetailsOf($shellFile,-1)
# 詳細プロパティを列挙 とりあえず310項目
#for ($i=0; $i -lt 310; $i++){
# Write-Host $i `t $shellFolder.GetDetailsOf($shellFolder.Items(),$i) `t $shellFolder.GetDetailsOf($shellFile,$i)
#}
# 詳細プロパティを取得
$datailId = 12 #撮影日
Write-Host $datailId `t $shellFolder.GetDetailsOf($shellFolder.Items(),$datailId) `t $shellFolder.GetDetailsOf($shellFile,$datailId)
$date_org = $shellFolder.GetDetailsOf($shellFile,$datailId)
# Get-DateでDateTimeオブジェクトにする(エラーが出る)
Get-Date $date_org
[DateTime]$date_org
$pat = "(\d{4}).*?(\d{1,2}).*?(\d{1,2}).*?(\d{1,2}.*?$)"
$regex = [regex]$pat
$hash_table = $regex.Matches($date_org)
$hash_table
$array = $hash_table.Groups
$date_new = [string]$array[1] + "-" + [string]$array[2] + "-" + [string]$array[3] + " " + [string]$array[4]
$date = Get-Date $date_new -Format "F"
Write-Host $date
