Question [Function] Récupération des types mime

Plus d'informations
il y a 17 ans 8 mois #2524 par Laurent Dardenne
Une seconde version utilisant l'information \"PerceivedType\" présente dans certaines déclaration d'extension. On peut ainsi prendre en compte de nombreuses extensions qui ne contiennent pas d'informations du type MIME, par exemple les fichiers \".ps1\".
[code:1]
################################################################################
#
# Nom : Get-MimeAndPerceivedType
# Récupère, dans la base de registre, les codages des types de fichiers (MIME) et ou leur 'catégorie' (PerceivedType)
#
# Version : 0.1
# Auteur : Laurent Dardenne
# Date : le 26/06/2008
#
# Info diverses :
# RFC : discrete-type = \"text\" / \"image\" / \"audio\" / \"video\" / \"application\" / extension-token
# PerceivedType (msdn.microsoft.com/en-us/library/bb762520(VS.85).aspx)
# \"PerceivedTypes are similar to file types except they refer to broad categories of file format types,
# rather than specific file types.\"
# Il existe l'API AssocGetPerceivedType (SHLWAPI.DLL) pour Windows XP sp2 uniquement
#
# Valeurs possible (au 26/06/08) :
# -3 Custom
# -2 Unspecified
# -1 Folder
# 0 Unknown
# 1 Text
# 2 Image
# 3 Audio
# 4 Video
# 5 Compressed
# 6 Document
# 7 System
# 8 Application
# 9 GameMedia
# 10 Contacts
#
#Fichier de registry pour créer une type Mime et/ou PerceivedType :
# [HKEY_CLASSES_ROOT\.gif]
# \"PerceivedType\"=\"image\"
# \"Content Type\"=\"image/gif\"
#
#voir aussi:
# www.msfn.org/board/Help-Need-Resource-or...on-of-Br-t97427.html
# msdn.microsoft.com/en-us/library/cc144148(VS.85).aspx
# msdn.microsoft.com/en-us/library/bb165967(VS.80).aspx
# www.codeproject.com/KB/dotnet/System_File_Association.aspx
# msdn.microsoft.com/en-us/library/bb166549(VS.80).aspx
# Windows Desktop Search Powershell Cmdlet
# www.codeproject.com/KB/cs/wdscmdlet.aspx
################################################################################
Function Get-MimeAndPerceivedType()
{ #Récupère les formats MIME
Push-Location
cd HKLM:\SOFTWARE\Classes
#On ne prend que les clés portant sur une extension de fichier sauf celles contenant '*' qui
#renvoient sur la même liste
dir \".*\"|Where {!($_.Name -match \"\*\"«»)}|`
#Pour chaque clés on parcourt la liste des propriétés
#Seul nous intéresse les clés ayant la propriété \"Content Type\" ou \"PerceivedType\"
Foreach {get-itemproperty -path $_.PSPath|Where { ($_.\"Content Type\" -ne $null) -or ($_.\"PerceivedType\" -ne $null)}}|`
#On récupére le couple extension, mimeType+PerceivedType dans une hastable (.bmp,{image/bmp,Image})
Foreach {$MimeAndPerceivedType=@{}}`
{$MimeAndPerceivedType.($_.PSChildName)=($_|select \"Content Type\",\"PerceivedType\"«»)}`
{$MimeAndPerceivedType}
Pop-Location
}
[/code:1]
On doit par contre utiliser un filtre pour déterminer le type (image,text,...):
[code:1]
filter Get-FileType
{
if ($global:MimeAndPerceivedType -eq $null)
{$global:MimeAndPerceivedType=Get-MimeAndPerceivedType}

$MPT=$global:MimeAndPerceivedType.($_.Extension)
#Extrait le champ 'discrete-type' du type Mime correspondant à l'extension du fichier courant
if ($MPT.\"Content Type\" -match \"^(.*)/(.*)$\"«»)
{ if ($matches[1] -ne \"text\"«»)
{ #on force le type pour ce cas de figure
#pour .asmx : Content Type=application/xml et PerceivedType=text
$PT=$MPT.PerceivedType
if (($PT -ne $null) -and ($PT -eq \"text\"«»))
{
$PT
return
}
} # $FileType \"text\"
$matches[1]
}
#Si la propriété \"Content Type\" est vide on essaie avec l'autre information de format
elseif ($MPT.PerceivedType -ne $null)
{ $MPT.PerceivedType }
#else rien
}
[/code:1]
ensuite :
[code:1]
$$MimeAndPerceivedType=Get-$MimeAndPerceivedType

Dir |Where-Object { ($_.PSIsContainer -eq 0)} |`
% { $Current=$_
switch (($Current|Get-FileType))
{
\"text\" {\"Texte : $Current\"}
\"image\" {\"Image : $Current\"}
\"application\" {\"Application : $Current\"}
\"audio\" {\"Audio : $Current\"}
default {\"Type inconnu.\"}
}
}
[/code:1]

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 4 mois #3200 par Laurent Dardenne
Correction tardive d'un bug bloquant le fonctionnement de ce script :
[code:1]
#Affichage parasite dans le pipe du à l'instruction cd
[HashTable]$MimeAndPerceivedType=Get-MimeAndPerceivedType
$MimeAndPerceivedType.Keys
# ne renvoi rien !
[/code:1]
[code:1]
Function Get-MimeAndPerceivedType()
{ #Récupère les formats MIME
Push-Location
$null=cd HKLM:\SOFTWARE\Classes
#On ne prend que les clés portant sur une extension de fichier sauf celles contenant '*' qui
#renvoient sur la même liste
dir \".*\"|Where {!($_.Name -match \"\*\"«»)}|`
#Pour chaque clés on parcourt la liste des propriétés
#Seul nous intéresse les clés ayant la propriété \"Content Type\" ou \"PerceivedType\"
Foreach {get-itemproperty -path $_.PSPath|Where { ($_.\"Content Type\" -ne $null) -or ($_.\"PerceivedType\" -ne $null)}}|`
#On récupére le couple extension, mimeType+PerceivedType dans une hastable (.bmp,{image/bmp,Image})
Foreach {$MimeAndPerceivedType=@{}}`
{$MimeAndPerceivedType.($_.PSChildName)=($_|select \"Content Type\",\"PerceivedType\"«»)}`
{$MimeAndPerceivedType}
Pop-Location
}
[/code:1]
Ensuite ceci fonctionne déjà mieux:
[code:1]
$MimeAndPerceivedType=Get-MimeAndPerceivedType
$MimeAndPerceivedType.Keys
[/code:1]
Autant pour moi, mes tests étaient fautif, il manquait \"juste\" ça :
[code:1]
Assert ($MimeAndPerceivedType -is [HashTable]) -label \"Reçoit une HashTable\"
RaiseAssertions
[/code:1]
Joli piège, PowerShell ça marche sans piper mot :S
Autre pratique typer les variables :
[code:1]
[HashTable]$MimeAndPerceivedType=Get-MimeAndPerceivedType
[/code:1]
Le dynamisme c'est puissant mais c'est sans filet :whistle:<br><br>Message édité par: Laurent Dardenne, à: 16/11/08 18:55

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.041 secondes
Propulsé par Kunena