Question [Fonction]Création de ressources

Plus d'informations
il y a 17 ans 11 mois #2508 par xyz
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 17 ans 11 mois #2561 par xyz
Réponse de xyz sur le sujet Re:[Fonction]Création de ressources
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.039 secondes
Propulsé par Kunena