Question [fonction]Création de constantes

Plus d'informations
il y a 15 ans 5 mois #3236 par Laurent Dardenne
Nostra écrit:

Bon maintenant je suis pas assez calé pour en tirer des conclusions

Je n'ai pas la science infuse non plus, c'est aussi en creusant ce genre de truc qu'on apprend.
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é :)<br><br>Message édité par: Laurent Dardenne, à: 14/11/08 12:34

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 5 mois #3237 par Grégory
ben apparemment tu gardes les méthodes et propriétés
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 ...

:huh:

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

Plus d'informations
il y a 15 ans 5 mois #3238 par Laurent Dardenne
Nostra écrit:

ben apparemment tu gardes les méthodes et propriétés

Exact je viens de vérifier, il y l'alias Name en plus.
Nostra écrit:

de même
[code:1]$apiconst.getenumerator()|%{$_.name}[/code:1]
ne fonctionne plus

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.
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.

Plus d'informations
il y a 15 ans 5 mois #3241 par Grégory
Très intéressant ton tuto (même si je comprend pas tout ...:unsure: )

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 B)

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

Plus d'informations
il y a 15 ans 5 mois #3244 par Laurent Dardenne
Nostra écrit:

Très intéressant ton tuto (même si je comprend pas tout

Merci, si tu as des questions poste-les ici .
Nostra écrit:

même si je n'ai pas d'applications concrètes qui me viennent à l'esprit

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.

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 :P

Nostra écrit:

j'ai l'impression que PS n'a pas fini de me surprendre

Je suis de ton avis, et la V2 en remet une couche, par exemple les événements :
[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.

Plus d'informations
il y a 15 ans 1 semaine #4528 par Laurent Dardenne
Correction de la prise en charge du type des constantes.
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 \&quot;cConst\&quot; $Const \&quot;Constantes test\&quot;
#
#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 \&quot;La propriété NomConstante est en lecture seule.\&quot;;}
#
#Pour retrouver les constantes : dir variable:c*|Where { (gv $_.name).options -match \&quot;constant\&quot;}

if ( !(Test-Path Variable:$VariableName) )
{
Write-Debug \&quot;La variable $VariableName n'existe pas.`r`nPile d'appel : $(ParseStack $(Get-CallStack))\&quot;

$obj= New-Object PSObject $VariableName
#Ajoute le nom de la variable d'origine car $this à pour nom \&quot;this\&quot; :/ .
#Ainsi en cas d'erreur on peut indiquer quelle variable est concernée.
$Code=\&quot;`$obj| add-member -memberType Scriptproperty -Name Name -value {`\&quot;$VariableName`\&quot;} -SecondValue {Throw `\&quot;La propriété $VariableName est en lecture seule.`\&quot;}\&quot;
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(\&quot;SWP_NOSIZE\&quot;,\&quot;SWP_NOMOVE\&quot;,\&quot;SWP_NOZORDER\&quot;,\&quot;SWP_NOACTIVATE\&quot;,\&quot;SWP_SHOWWINDOW\&quot;«»)
$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(\&quot;P1\&quot;«») renvoi la valeur de $this.p1
# Si add(\&quot;P1\&quot;,\&quot;P2\&quot;«») renvoi la somme de $this.p1 + $this.p2
# Si add() renvoi $NULL
# Si add(\&quot;Propriété inconnue\&quot;«») 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.\&quot;$_\&quot; -eq $null)
{Throw \&quot;Le nom de propriété $_ n'existe pas pour la variable $($this.Name).\&quot;}
$Result +=$this.\&quot;$_\&quot;
Write-Debug \&quot;$($this.Name).Add() : $_`tResult=$Result\&quot;
}#For
$Result
}#If count = 0
else
{
Write-Debug \&quot;$($this.Name).Add(): le tableau d'arguments est vide.\&quot;
$null
}
} # ScriptMethod Add

$Data.GetEnumerator()|`
%{ #Construit le code de la création d'un objet ayant des propriétés en lecture seule
$TypeName=\&quot;\&quot;
if ($_.Value -ne $null)
{$TypeName=$_.Value.GetType().FullName}
else
{Write-Error \&quot;La valeur de la clé $($_.Key) est null.\&quot;}
Write-Debug (\&quot;Key :{0} Value:{1} [{2}]\&quot; -F $_.Key,$_.Value,$TypeName)
$C1=\&quot;`$obj| add-member -memberType Scriptproperty\&quot;
$C2=\&quot;-Name $($_.Key)\&quot;
$C3=\&quot;-value {[$TypeName] $($_.Value)}\&quot;
$C4=\&quot;-SecondValue {Throw `\&quot;La propriété $($_.Key) est en lecture seule.`\&quot;}\&quot;
$Code=\&quot;$C1 $C2 $C3 $C4\&quot;
#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 \&quot;La variable $VariableName existe déjà.\&quot;
Write-Debug \&quot;Pile d'appel : $(ParseStack $(Get-CallStack))\&quot;
}
}

$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]\&quot;0x80000000\&quot; #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](\&quot;0x80000000\&quot; -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 \&quot;cApiWindows\&quot; $APIConst \&quot;Constantes des API Windows Win32\&quot;
remove-variable APIConst
[/code:1]

Tutoriels PowerShell

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

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