Question [fonction]Création de constantes
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Je n'ai pas la science infuse non plus, c'est aussi en creusant ce genre de truc qu'on apprend.Bon maintenant je suis pas assez calé pour en tirer des conclusions
En tout cas avec cette manip tu perds les propriétés de la classe et celle d'ETS.
Mais je vais faire la manip, t'as piqué ma curiosité
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Grégory
- Hors Ligne
- Membre senior
-
- Messages : 49
- Remerciements reçus 0
c'est juste que j'ai fait CTRL Cpour tout avoir à l'écran
en tout cas get-member me renvoit les mêmes choses
Ce que je trouve étonnant c'est que juste en modifiant le nom on obtient Key à la place de Name
de même
[code:1]$apiconst.getenumerator()|%{$_.name}[/code:1]
ne fonctionne plus
pourtant je n'ai pas touché à name, key et value ...
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Exact je viens de vérifier, il y l'alias Name en plus.ben apparemment tu gardes les méthodes et propriétés
Nostra écrit:
Oui c'est normal puisque c'est un alias qui avec ce bricolage se retrouve sur la classe Hashtable et plus sur DictionaryEntry. Mais $_.Key fonctionne tjrs.de même
[code:1]$apiconst.getenumerator()|%{$_.name}[/code:1]
ne fonctionne plus
Mais dans ce cas,dans la classe Hashtable, l'alias Name pointe sur la propriété Key qui n'existe pas dans la classe Hashtable.
PowerShell recherche dans une ordre précis les propriétés qu'on interroge. Si elle n'existent pas dans la classe il vérifie dans le système de type (ETS) sinon il ne fait rien considérant que la propriété n'existe pas.
Consulte le tutoriel sur les objets synthètiques j'y ai donné quelques infos sur le sujet.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Grégory
- Hors Ligne
- Membre senior
-
- Messages : 49
- Remerciements reçus 0
je suis surtout impressionné par scriptmethod et scriptproperty (même si je n'ai pas d'applications concrètes qui me viennent à l'esprit)
j'ai l'impression que PS n'a pas fini de me surprendre
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Merci, si tu as des questions poste-les ici .Très intéressant ton tuto (même si je comprend pas tout
Nostra écrit:
C'est un des mécanismes de la programmation orienté objet à la sauce PowerShell. Leur usage est de rattacher des informations et/ou du code à un objet et permet d'encapsuler les détails.même si je n'ai pas d'applications concrètes qui me viennent à l'esprit
Une fois l'objet créé on ne se préoccupe plus que de ce qu'il sait faire et pas du comment il sait le faire. On utilise plus volontiers le cmdlet Get-Member que de son code source ou des fichiers de type .ps1xml.
C'est une manière d'écrire du code, et ce mécanisme n'a pas d'autre usage que celui lié à la conception logicielle.
Les applications concrètes sont toutes celles qui viennent à l'esprit, il faut juste changer sa manière de voir les choses
Nostra écrit:
Je suis de ton avis, et la V2 en remet une couche, par exemple les événements :j'ai l'impression que PS n'a pas fini de me surprendre
[code:1]
New-PSEvent
Get-PSEvent
Wait-PSEvent
Remove-PSEvent
Register-ObjectEvent
Register-WmiEvent
Register-PSEvent
Get-PSEventSubscriber
Unregister-PSEvent
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Désormais on peut créer plusieurs variables constantes basées sur le même principe :
[code:1]
function Set-Constant( [string] $VariableName, [HashTable] $Data, [String] $Description, [Int32] $Scope=1)
{ #Crée une variable constante de nom $VariableName dans la portée de l'appelant
#La variable est créé par défaut dans la portée de l'appelant, sinon dans celle précisée par $Scope
#
#Exemple :
# $Const=@{
# NomConstante=[Intptr] 567}
# Set-Constant \"cConst\" $Const \"Constantes test\"
#
#Pour chaque entrée de la hashtable $DATA on crée un membre de type ScriptProperty en lecture seule :
# cConst.NomConstante {get=[System.IntPtr] 567;set=Throw \"La propriété NomConstante est en lecture seule.\";}
#
#Pour retrouver les constantes : dir variable:c*|Where { (gv $_.name).options -match \"constant\"}
if ( !(Test-Path Variable:$VariableName) )
{
Write-Debug \"La variable $VariableName n'existe pas.`r`nPile d'appel : $(ParseStack $(Get-CallStack))\"
$obj= New-Object PSObject $VariableName
#Ajoute le nom de la variable d'origine car $this à pour nom \"this\" :/ .
#Ainsi en cas d'erreur on peut indiquer quelle variable est concernée.
$Code=\"`$obj| add-member -memberType Scriptproperty -Name Name -value {`\"$VariableName`\"} -SecondValue {Throw `\"La propriété $VariableName est en lecture seule.`\"}\"
invoke-expression $Code
$Code=$null
#Dans les appels d'API on avoir à additionner plusieurs valeurs :
# $cApiWindows.SWP_NOSIZE + $cApiWindows.SWP_NOMOVE + $cApiWindows.SWP_NOZORDER + $cApiWindows.SWP_NOACTIVATE + $cApiWindows.SWP_SHOWWINDOW
#On facilite donc la saisie en ajoutant une méthode Add.
# $cApiWindows.Add(\"SWP_NOSIZE\",\"SWP_NOMOVE\",\"SWP_NOZORDER\",\"SWP_NOACTIVATE\",\"SWP_SHOWWINDOW\"«»)
$obj| add-member -memberType ScriptMethod -name Add {
#Additionne le contenu des noms de propriétés, de l'objet courant $this, passées en paramètre.
# Si add(\"P1\"«») renvoi la valeur de $this.p1
# Si add(\"P1\",\"P2\"«») renvoi la somme de $this.p1 + $this.p2
# Si add() renvoi $NULL
# Si add(\"Propriété inconnue\"«») déclenche une exception
# $Args est un tableau d'objet, on le cast en un tableau de chaîne
$Parameters=$Args -as [String[]]
if ($Parameters.count -ne 0)
{
$Result=0;
$Parameters|Foreach {
if ($this.\"$_\" -eq $null)
{Throw \"Le nom de propriété $_ n'existe pas pour la variable $($this.Name).\"}
$Result +=$this.\"$_\"
Write-Debug \"$($this.Name).Add() : $_`tResult=$Result\"
}#For
$Result
}#If count = 0
else
{
Write-Debug \"$($this.Name).Add(): le tableau d'arguments est vide.\"
$null
}
} # ScriptMethod Add
$Data.GetEnumerator()|`
%{ #Construit le code de la création d'un objet ayant des propriétés en lecture seule
$TypeName=\"\"
if ($_.Value -ne $null)
{$TypeName=$_.Value.GetType().FullName}
else
{Write-Error \"La valeur de la clé $($_.Key) est null.\"}
Write-Debug (\"Key :{0} Value:{1} [{2}]\" -F $_.Key,$_.Value,$TypeName)
$C1=\"`$obj| add-member -memberType Scriptproperty\"
$C2=\"-Name $($_.Key)\"
$C3=\"-value {[$TypeName] $($_.Value)}\"
$C4=\"-SecondValue {Throw `\"La propriété $($_.Key) est en lecture seule.`\"}\"
$Code=\"$C1 $C2 $C3 $C4\"
#Exécute le code créé
invoke-expression $Code
}#Foreach
#on évite de nombreuses variables globales au prix de possible constructions fréquentes
Set-Variable $VariableName -value $Obj -option constant -scope $Scope -description $Description
}
else
{
Write-Warning \"La variable $VariableName existe déjà.\"
Write-Debug \"Pile d'appel : $(ParseStack $(Get-CallStack))\"
}
}
$APIConst=@{
HWND_TOP=[Intptr]0
HWND_BOTTOM=[Intptr]1
HWND_TOPMOST=[Intptr]-1
HWND_NOTOPMOST=[Intptr]-2
ICON_SMALL =[IntPtr]0 #typedef UINT WPARAM =[IntPtr]
#BS_PUSHBUTTON=[IntPtr]0 # typedef LONG LPARAM = [IntPtr]
GWL_WNDPROC =[Int32]-4
GWL_HINSTANCE =[Int32]-6
GWL_HWNDPARENT =[Int32]-8
GWL_STYLE =[Int32]-16
GWL_EXSTYLE =[Int32]-20
GWL_USERDATA =[Int32]-21
GWL_ID =[Int32]-12
DWL_MSGRESULT =[Int32]0
DWL_DLGPROC =[Int32]4
DWL_USER =[Int32]8
MF_BYCOMMAND =[UInt32]0
MF_BYPOSITION =[UInt32]1024
MF_STRING =[UInt32]0
MF_BITMAP =[UInt32]4
MF_OWNERDRAW =[UInt32]256
MF_ENABLED =[UInt32]0
MF_GRAYED =[UInt32]1
MF_DISABLED =[UInt32]2
SC_SIZE =[UInt32] 0xF000
SC_MOVE =[UInt32] 0xF010
SC_MINIMIZE =[UInt32] 0xF020
SC_MAXIMIZE =[UInt32] 0xF030
SC_NEXTWINDOW =[UInt32]0xF040
SC_PREVWINDOW=[UInt32]0xF050
SC_CLOSE =[UInt32]0xF060
SC_VSCROLL=[UInt32]0xF070
SC_HSCROLL=[UInt32]0xF080
SC_MOUSEMENU=[UInt32]0xF090
SC_KEYMENU =[UInt32]0xF100
SC_ARRANGE =[UInt32]0xF110
SC_RESTORE =[UInt32]0xF120
SC_TASKLIST =[UInt32]0xF130
SC_SCREENSAVE =[UInt32]0xF140
SC_HOTKEY =[UInt32]0xF150
SC_DEFAULT =[UInt32]0xF160
SC_MONITORPOWER =[UInt32]0xF170
SC_CONTEXTHELP =[UInt32]0xF180
SC_SEPARATOR =[UInt32]0xF00F
SW_HIDE =[Int32]0
SW_SHOWNORMAL =[Int32]1
SW_NORMAL =[Int32]1
SW_SHOWMINIMIZED =[Int32]2
SW_SHOWMAXIMIZED =[Int32]3
SW_MAXIMIZE =[Int32]3
SW_SHOWNOACTIVATE =[Int32]4
SW_SHOW =[Int32]5
SW_MINIMIZE =[Int32]6
SW_SHOWMINNOACTIVE =[Int32]7
SW_SHOWNA =[Int32]8
SW_RESTORE =[Int32]9
SW_SHOWDEFAULT =[Int32]10
SW_MAX =[Int32]10
SWP_NOSIZE =[UInt32]1
SWP_NOMOVE =[UInt32]2
SWP_NOZORDER =[UInt32]4
SWP_NOREDRAW =[UInt32]8
SWP_NOACTIVATE =[UInt32]16
SWP_FRAMECHANGED =[UInt32]32
SWP_SHOWWINDOW =[UInt32]64
SWP_HIDEWINDOW =[UInt32]128
SWP_NOCOPYBITS =[UInt32]256
SWP_NOOWNERZORDER =[UInt32]512
SWP_NOSENDCHANGING =[UInt32]1204
SWP_DRAWFRAME =[UInt32]32 #SWP_FRAMECHANGED
SWP_NOREPOSITION =[UInt32]512 #SWP_NOOWNERZORDER
SWP_DEFERERASE =[UInt32]8192
SWP_ASYNCWINDOWPOS =[UInt32]16384
WM_SETICON =[UInt32]0x0080
# Window Styles
WS_OVERLAPPED =[UInt32]0
#Pour la valeur 0x80000000, les guillemets forcent
#sa prise en compte en tant qu'entier non-signé.
WS_POPUP =[UInt32]\"0x80000000\" #Ou [UInt32]0x80000000L (2 conversions)
WS_CHILD =[UInt32]0x40000000
WS_MINIMIZE =[UInt32]0x20000000
WS_VISIBLE =[UInt32]0x10000000
WS_DISABLED =[UInt32]0x08000000
WS_CLIPSIBLINGS =[UInt32]0x04000000
WS_CLIPCHILDREN =[UInt32]0x02000000
WS_MAXIMIZE =[UInt32]0x01000000
WS_CAPTION =[UInt32]0x00C00000# WS_BORDER or WS_DLGFRAME
WS_BORDER =[UInt32]0x00800000
WS_DLGFRAME =[UInt32]0x00400000
WS_VSCROLL =[UInt32]0x00200000
WS_HSCROLL =[UInt32]0x00100000
WS_SYSMENU =[UInt32]0x00080000
WS_THICKFRAME =[UInt32]0x00040000
WS_GROUP =[UInt32]0x00020000
WS_TABSTOP =[UInt32]0x00010000
WS_MINIMIZEBOX =[UInt32]0x00020000
WS_MAXIMIZEBOX =[UInt32]0x00010000
WS_TILED =[UInt32]0 #WS_OVERLAPPED
WS_ICONIC =[UInt32]0x20000000 #WS_MINIMIZE
WS_SIZEBOX =[UInt32]0x00040000 #WS_THICKFRAME
#Common Window Styles
#(WS_OVERLAPPED -bor WS_CAPTION -bor WS_SYSMENU -bor WS_THICKFRAME -bor WS_MINIMIZEBOX -bor WS_MAXIMIZEBOX)
WS_OVERLAPPEDWINDOW =[UInt32](0 -bor 0x00C00000 -bor 0x00080000 -bor 0x00040000 -bor 0x00020000 -bor 0x00010000)
# =WS_OVERLAPPEDWINDOW
WS_TILEDWINDOW =[UInt32](0 -bor 0x00C00000 -bor 0x00080000 -bor 0x00040000 -bor 0x00020000 -bor 0x00010000)
#(WS_POPUP or WS_BORDER or WS_SYSMENU)
# *** Construction impossible : [UInt32](\"0x80000000\" -bor 0x00800000 -bor 0x00080000) ***
WS_POPUPWINDOW =[uint32](0x80000000L + 0x00800000L + 0x00080000L)
# WS_CHILD
WS_CHILDWINDOW =[UInt32]0x40000000
# Extended Window Styles
WS_EX_DLGMODALFRAME =[UInt32]1
WS_EX_NOPARENTNOTIFY =[UInt32]4
WS_EX_TOPMOST =[UInt32]8
WS_EX_ACCEPTFILES =[UInt32]0x10
WS_EX_TRANSPARENT =[UInt32]0x20
WS_EX_MDICHILD =[UInt32]0x40
WS_EX_TOOLWINDOW =[UInt32]0x80
WS_EX_WINDOWEDGE =[UInt32]0x100
WS_EX_CLIENTEDGE =[UInt32]0x200
WS_EX_CONTEXTHELP =[UInt32]0x400
WS_EX_RIGHT =[UInt32]0x1000
WS_EX_LEFT =[UInt32]0
WS_EX_RTLREADING =[UInt32]0x2000
WS_EX_LTRREADING =[UInt32]0
WS_EX_LEFTSCROLLBAR =[UInt32]0x4000
WS_EX_RIGHTSCROLLBAR =[UInt32]0
WS_EX_CONTROLPARENT =[UInt32]0x10000
WS_EX_STATICEDGE =[UInt32]0x20000
WS_EX_APPWINDOW =[UInt32]0x40000
# (WS_EX_WINDOWEDGE -bor WS_EX_CLIENTEDGE)
WS_EX_OVERLAPPEDWINDOW =[UInt32](0x100 -bor 0x200)
#(WS_EX_WINDOWEDGE -bor WS_EX_TOOLWINDOW -bor WS_EX_TOPMOST)
WS_EX_PALETTEWINDOW =[UInt32](0x100 -bor 0x80 -bor 8)
WS_EX_LAYERED =[UInt32]0x00080000
WS_EX_NOINHERITLAYOUT =[UInt32]0x00100000 #Disable inheritence of mirroring by children
WS_EX_LAYOUTRTL =[UInt32]0x00400000 #Right to left mirroring
WS_EX_COMPOSITED =[UInt32]0x02000000
WS_EX_NOACTIVATE =[UInt32]0x08000000
}#APIConst
#Crée dans la portée de l'appelant la constante globale nommée cApiWindows.
#Cette constante est utilisée par les fonctions qui suivent.
Set-Constant \"cApiWindows\" $APIConst \"Constantes des API Windows Win32\"
remove-variable APIConst
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Contributions à la communauté
- [fonction]Création de constantes