-
-
Save woehrl01/5f50cb311f3ec711f6c776b2cb09c34e to your computer and use it in GitHub Desktop.
# based on https://gallery.technet.microsoft.com/scriptcenter/Get-FileMetaData-3a7ddea7 | |
function Get-FileMetaData | |
{ | |
<# | |
.SYNOPSIS | |
Get-FileMetaData returns metadata information about a single file. | |
.DESCRIPTION | |
This function will return all metadata information about a specific file. It can be used to access the information stored in the filesystem. | |
.EXAMPLE | |
Get-FileMetaData -File "c:\temp\image.jpg" | |
Get information about an image file. | |
.EXAMPLE | |
Get-FileMetaData -File "c:\temp\image.jpg" | Select Dimensions | |
Show the dimensions of the image. | |
.EXAMPLE | |
Get-ChildItem -Path .\ -Filter *.exe | foreach {Get-FileMetaData -File $_.Name | Select Name,"File version"} | |
Show the file version of all binary files in the current folder. | |
#> | |
param([Parameter(Mandatory=$True)][string]$File = $(throw "Parameter -File is required.")) | |
if(!(Test-Path -Path $File)) | |
{ | |
throw "File does not exist: $File" | |
Exit 1 | |
} | |
$tmp = Get-ChildItem $File | |
$pathname = $tmp.DirectoryName | |
$filename = $tmp.Name | |
$hash = @{} | |
try{ | |
$shellobj = New-Object -ComObject Shell.Application | |
$folderobj = $shellobj.namespace($pathname) | |
$fileobj = $folderobj.parsename($filename) | |
for($i=0; $i -le 294; $i++) | |
{ | |
$name = $folderobj.getDetailsOf($null, $i); | |
if($name){ | |
$value = $folderobj.getDetailsOf($fileobj, $i); | |
if($value){ | |
$hash[$($name)] = $($value) | |
} | |
} | |
} | |
}finally{ | |
if($shellobj){ | |
[System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$shellobj) | out-null | |
} | |
} | |
return New-Object PSObject -Property $hash | |
} | |
Export-ModuleMember -Function Get-FileMetadata |
Another approach to fixing the malformed DateTime's returned ie "Content created". Replace all non digits and use DateTime.ParseExact Method:
Get-FileMetaData -File 'C:\MyExcelFile.xlsx' | Select-Object -Property Name, @{Name="Content created";Expression={[DateTime]::ParseExact(($_.'Content created' -replace "\D"), "ddMMyyyyHHmm", $null)}}
Is there a way to modifiy the metadata of file?
@songyongshun There isn’t a dedicated PowerShell cmdlet that I know of for editing file metadata natively. PowerShell relies on either the Shell.Application COM object or on third-party utilities (e.g., ExifTool). The example below uses the Shell.Application COM object, which is bundled with Windows, but it’s not an official PowerShell cmdlet.
More details on what you trying to edit?
Function Set-FileMetaData {
param(
[Parameter(Mandatory=$true)]
[string]$FilePath
[Parameter(Mandatory=$true)]
[int]$PropertyIndex,
[Parameter(Mandatory=$true)]
[string]$NewValue
)
$shell = New-Object -ComObject Shell.Application
$folder = $shell.Namespace((Split-Path $FilePath -Parent))
$file = $folder.ParseName((Split-Path $FilePath -Leaf))
$folder.SetDetailsOf($file, $PropertyIndex, $NewValue)
}
#To Use
Set-FileMetaData -FilePath "C:\Path\To\File.mp3" -PropertyIndex 21 -NewValue "The New Title"
The output gives the following.
LRM
When you do
Get-FileMetaData -File "W:\Photos\Canon 800D\2019\2019_12_08\IMG_1302_1.JPG" | Select "Date taken"
, etc...
The output has Unicode characters U+200E
and U+200F
Copy and Pasted into Notepad++ shows LRM and RLM
How can we eliminate this so the output is clean without these Unicode characters?
Have an update for your code.
replace line 52
#$hash[$($name)] = $($value)
with this
$hash[$($name)] = $($value) -replace "\u200E","" -replace "\u200F",""
This will get rid of the Unicode characters U+200E and U+200F.
For anyone interested.
I have the updated code on my site now.
PowerShell Get-FileMetaData - Remove Unicode Characters from Output
I had a bit of a nightmare with the date parsing for the "Date Taken" due to hidden Unicode values.
Can see the Unicode in VS Code:

So, I wrote a complimentary Parse-Date function :