Question [Function] Récupération des types mime
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 17 ans 8 mois #2524
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:[Function] Récupération des types mime
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]
[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.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 17 ans 4 mois #3200
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:[Function] Récupération des types mime
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
Autre pratique typer les variables :
[code:1]
[HashTable]$MimeAndPerceivedType=Get-MimeAndPerceivedType
[/code:1]
Le dynamisme c'est puissant mais c'est sans filet
<br><br>Message édité par: Laurent Dardenne, à: 16/11/08 18:55
[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
Autre pratique typer les variables :
[code:1]
[HashTable]$MimeAndPerceivedType=Get-MimeAndPerceivedType
[/code:1]
Le dynamisme c'est puissant mais c'est sans filet
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.043 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Contributions à la communauté
- [Function] Récupération des types mime