Is it possible for PowerShell to determine what a given file\'s type is? For example, if I pass it a path of C:\\Foo.zip
, can I have it determine that the file
If you have .NET 4.5+, you can use the static method System.Web.MimeMapping.GetMimeMapping:
> Add-Type -AssemblyName "System.Web"
> [System.Web.MimeMapping]::GetMimeMapping("C:\foo.zip")
application/x-zip-compressed
Credit goes to this answer to a similar question about .NET.
Edit: Misread the question. GetMimeMapping
returns the MIME type by extension, it doesn't analyze the contents.
PowerShell, like rest of the Windows operating system, merely guesses the file type based on the extension.
However, there are third-party file type guesser programs out there, ones that actually look at the contents of the file.
There is a truly excellent answer to this question over on SuperUser. Top recommendations include File for Windows and TrID.
You can get the mime types from the registry. Unfortunately the HKEY_CURRENT_USER hive isn't auto-mapped as a drive so you'll have to put a check in for that first.
function Get-MimeType()
{
param($extension = $null);
$mimeType = $null;
if ( $null -ne $extension )
{
$drive = Get-PSDrive HKCR -ErrorAction SilentlyContinue;
if ( $null -eq $drive )
{
$drive = New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT
}
$mimeType = (Get-ItemProperty HKCR:$extension)."Content Type";
}
$mimeType;
}
Here's an example usage
PS> Get-MimeType -extension .zip
application/x-zip-compressed
-Joe
$ext = ".exe"
$null = New-PSDrive HKCR Registry HKEY_CLASSES_ROOT -ea 0
$mime = (gp HKCR:$ext)."Content Type"
write-host $ext $mime