Question [Fonction]Création de ressources

Plus d'informations
il y a 15 ans 10 mois #2508 par Laurent Dardenne
Voici un script permettant de créer une ressource.
On crée un objet synthétique avant de l'enregistrer dans un fichier .resource.
Une tutoriel sur le sujet devrait suivre.
[code:1]
################################################################################
#
# Nom : ConvertTo-Resource.ps1
# Converti un fichier ou objet en une ressource
# Pour faciliter la reconnaissance du type d'objet synthétique (Ressource) on utilisera le GUID suivant :\"18e85e6f-0982-4b8e-b74f-0a096fc44436\"
#
# $Compteur : La clé d'une ressource peut être inconnue, dans ce cas on utilise un compteur (\"Resource$Compteur\"«»).
# Par défaut débute à zéro. ** Attention aux risques de duplication de nom de ressource. **
#
# $FromHashTable : Indique que l'on crée une ressource pour chacun de éléments des objets de type HashTable.
# Dans ce cas l'objet Hashtable ne pourrat être reconstruit via Read-Resources.
# Par défaut pour les objets de type HashTable on crée une seule ressource.
#
# Comment ajouter des ressources dans un tableau ?
# $MaVariable=@{1=\"Un\";2=\"Deux\";3=\"Trois\"}
# $ht=@{\"Tableau\"=@(5,1,485);\"HashTable\"=$MaVariable;\"String\"=\"Test\"}
# $x='a',-1.52|ConvertTo-Resource
# $x+=$ht|ConvertTo-Resource -fromhashtable

# Version : 0.1
# Auteur : Laurent Dardenne
# Date : le 27/05/2008
#
################################################################################
Function ConvertTo-Resource([int]$Compteur=0,[switch] $FromHashTable)
{
begin
{
write-Debug (\"[{0}] Begin : {1}\" -F ($MyInvocation.InvocationName,\"Initialisation de la liste des formats Mime\"«»))
$null=[Reflection.Assembly]::LoadWithPartialName(\"System.Drawing\"«»)
#Traitement relativement long, seul le premier appel est plus long
if ($global:Mime -eq $null)
{$global:Mime=Get-TypeMime}

#Construit un objet resource: Name,Value,ResourceType
$sbCreateObjectResource={
write-Debug \"`tCréation d'un objet ressource.\"
# Crée un objet de base
$Objet = new-object System.Management.Automation.PsObject
# Ajoute une propriété contenant les données de la ressource
$Objet|add-member NoteProperty Data -value $Data -Passthru|`
# Ajoute une propriété contenant le GUID de \"la classe\"
# Simule la notion de \"type\" unique
#[System.Guid]::NewGuid().toString()
add-member ScriptProperty ClassGuid -value {\"18e85e6f-0982-4b8e-b74f-0a096fc44436\"} -passThru|`
# Ajoute une propriété en lecture seul contenant le nom de la ressource
add-member ScriptProperty Name -value {$this.Data.Name} -passThru|`
# Ajoute une propriété en lecture seul contenant les données de la ressource
add-member ScriptProperty Value -value {$this.Data.Value} -passThru|`
# Ajoute une propriété en lecture seul contenant le nom court du type de la ressource
add-member ScriptMethod FormatShortName {
#On récupére la première partie du nom de type séparé soit par un espace soit par une virgule
($this.Data.Value.GetType().split(\", \"«»))[0] } -passThru
# *** L'objet créé et modifié est envoyé dans le pipe ***
}#$sbCreateObjectResource
}#begin

process
{
#Une erreur dans le pipe provoque cette exception, dans ce cas on \"propage\" l'arrêt dans ce segment
#Sinon les données encore présente dans le pipe transitent vers le segment en erreur
trap [System.Management.Automation.PipelineStoppedException]
{write-Debug (\"[{0}] Process : {1}\" -F ($MyInvocation.InvocationName,\"Stop le pipeline via Break.\"«»))
Break}

#Switch utilise lui aussi le symbole $_ pour mémoriser la valeur courante sélectionnée
#d'où la collision avec l'objet du pipe désigné lui aussi par le symbole $_.
$Current=$_
write-Debug (\"[{0}] Process : {1}\" -F ($MyInvocation.InvocationName,$Current.Name))
#On traite soit un fichier soit un objet/variable ( ou $null)
if ($Current -is [System.IO.FileInfo])
{ write-Debug (\"`tFile extension : {0}\" -F $Current.Extension)
write-Debug (\"`tMime : {0}\" -F $global:Mime.($Current.Extension))
#Extrait le champ 'discrete-type' du type Mime correspondant à l'extension du fichier courant
if ($global:Mime.($Current.Extension) -match \"^(.*)/(.*)$\"«»)
{
#$matches est une variable automatique de PowerShell lié aux expressions régulières
write-Debug (\"Match extension : {0}\" -F $matches[1])
switch ($matches[1]) {
#RFC : discrete-type := \"text\" / \"image\" / \"audio\" / \"video\" /\"application\" / extension-token
\"image\" { #Lit les données de l'image à partir du fichier
$Image=[System.Drawing.Image]::FromFile($Current.FullName)
#Mémorise les informations en les recopiant
$Data=@{
Name=$Current.Name
#L'image doit être dupliquée sinon l'appel à Dispose supprime l'objet
#Ces objets image seront supprimés soit explicitement via l'appel à Dispose()
#soit implicitement par le garbage collector, et ce via le finaliseur.
Value=$Image.Clone()
}#$Data
$Image.Dispose() #Libération explicite des ressources GDI
}#\"image\"
\"text\" {
# On récupére un tableau de string
[string[]] $Text=Get-Content $Current.FullName
$Data=@{
Name=$Current.Name
#Ici on souhaite mémoriser le contenu du tableau dans une string
#On crée donc une seul ressource
Value=[string]::Join(\"`r`n\", $Text);
} #$Data
}#\"text\"
default { # \"application\", \"audio\" , \"video\" =System.Byte[]
#On récupére un tableau d'octet pour les autres types MIME
#On doit préciser le type
[byte[]] $Content=Get-Content $Current.FullName -encoding Byte
$Data=@{
Name=$Current.Name
Value=$Content
}
}#default
}#switch
}#if $Mime -match
else
{ #TODO PerceivedType -> msdn.microsoft.com/en-us/library/bb776871(VS.85).aspx
Write-Warning (\"[{0}] {1}\" -F ($MyInvocation.InvocationName,\"Il n'existe pas de type MIME pour l'extension suivante $($Current.Extension).\"«»))
return
}
}#if is FileInfo
else
{
if ($FromHashTable.isPresent)
{ write-Debug \"`tSwitch FromHashTable présent.\"
if ($Current -is [System.Collections.HashTable])
{ write-Debug \"`tTraitement des éléments($($Current.count)) d'une hastable.\"
#Crée un objet ressource pour chaque entrée de la hastable
$Current.GetEnumerator()|% {
$Data=@{
Name=$_.Key
Value=$_.Value
}
&$sbCreateObjectResource
}#$Current.GetEnumerator
return
} #If hastable
}
$Data=@{
#Génération automatique du nom de la ressource
Name=\"Resource$Compteur\"
Value=$Current
}
$Compteur++
} #Else
&$sbCreateObjectResource
}#process
}
[/code:1]
Exemple avec des objets/variables :
[code:1]
$n=$null
[char] $c='a'
$p=10
$r=[ref] $p #pas sérialisable
$ti=@(5,1,485)
$ts=@(\"Un\",\"Deux\",\"Trois\"«»)
$Ht=@{1=\"Un\";2=\"Deux\";3=\"Trois\"}
$v=(gv ti) #pas sérialisable
$o=\"\"|select p1,p2 #pas sérialisable
$sp=(get-date)-(1|%{Start-sleep 1;get-date})
$sb={
#Script block sur plusieurs lignes
Write-host \"Ok\"
} #N'est pas sérialisable


$p,10,$n,$ti,$ts,\"Test\",$False,$c,'a',-1.52,(get-date),(gv p),$r,$o,$sb,$sp,$ht|ConvertTo-Resource
#|Create-Resource (join-path $pwd Tst1.resources)
[/code:1]
Exemple avec des fichiers :
[code:1]
Get-ChildItem * | Where-Object { ($_.PSIsContainer -eq 0) -and ($_.Extension -match \"(.jpg|.bmp|.ico|.gif|.tif|.txt|.Pdf|.Wav)\"«»)}| ConvertTo-Resource
#|Create-Resource (join-path $pwd Tst1.resources)
[/code:1]

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 9 mois #2561 par Laurent Dardenne
Comme prévu voici un tutoriel , le sujet
les fichiers Alternate Data Stream(stream NTFS) et les fichiers .resources de .NET.

Il y a également une solution de localisation de script en Powershell V1.

Tutoriels PowerShell

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

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