Question [Function PS v2] Replace-String
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 13 ans 8 mois #7503
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:[Function PS v2] Replace-String
Concernant la méthode $PSCmdlet.WriteObject, voici comment émettre un objet dans le pipeline sans perdre ses propriétés personnalisés.
Pour un objet qui n'est pas une collection :
[code:1]
$Return=$Return|Add-Member AliasProperty ComputerName Hosts –passthru
#Passe un tableau d'objet contenant un élément, un objet.
#PS énumére le tableau et renvoi un seul objet de type [PSobject]
$PSCmdlet.WriteObject(@($Return),$True)
[/code:1]
Pour un objet qui est une collection :
[code:1]
$Return=@(\"Un\",\"Deux\"«»)
$$Return=,$$Return|Add-Member AliasProperty AliasRank Rank –passthru
#Passe un tableau d'objet contenant un élément, un tableau d'objet
#PS énumére le tableau et renvoi un seul objet de type [Object[]]. Le tableau émit est un [PSobject]
#Les objets imbriqués ne sont pas transformés en PSObject,
#à moins de leurs appliquer Add-Member ou de les caster explicitement.
$PSCmdlet.WriteObject(@(,$Return),$True)
[/code:1]
Pour un objet qui n'est pas une collection :
[code:1]
$Return=$Return|Add-Member AliasProperty ComputerName Hosts –passthru
#Passe un tableau d'objet contenant un élément, un objet.
#PS énumére le tableau et renvoi un seul objet de type [PSobject]
$PSCmdlet.WriteObject(@($Return),$True)
[/code:1]
Pour un objet qui est une collection :
[code:1]
$Return=@(\"Un\",\"Deux\"«»)
$$Return=,$$Return|Add-Member AliasProperty AliasRank Rank –passthru
#Passe un tableau d'objet contenant un élément, un tableau d'objet
#PS énumére le tableau et renvoi un seul objet de type [Object[]]. Le tableau émit est un [PSobject]
#Les objets imbriqués ne sont pas transformés en PSObject,
#à moins de leurs appliquer Add-Member ou de les caster explicitement.
$PSCmdlet.WriteObject(@(,$Return),$True)
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Richard Lazaro
- Hors Ligne
- Membre platinium
Réduire
Plus d'informations
- Messages : 530
- Remerciements reçus 0
il y a 13 ans 8 mois #7504
par Richard Lazaro
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Réponse de Richard Lazaro sur le sujet Re:[Function PS v2] Replace-String
Ce qu'il faut surtout arriver à trouver, c'est savoir si il est possible de créer un alias dans une classe C# ... cela permettrait un Binding de Cmdlet sans perdre le type de l'objet.
Mais sinon, merci pour ses informations ^^ J'avais un peu la flemme de lire msdn et co
Mais sinon, merci pour ses informations ^^ J'avais un peu la flemme de lire msdn et co
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
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 : 6302
- Remerciements reçus 68
il y a 13 ans 8 mois #7505
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:[Function PS v2] Replace-String
Richard Lazaro écrit:
[code:1]
#via Reflector.exe sur les assemblies de PS v2
internal static RemoteDataObject GeneratePSEventArgs(Guid clientRunspacePoolId, PSEventArgs e)
{
using (_trace.TraceMethod())
{
PSObject data = CreateEmptyPSObject();
data.Properties.Add(new PSNoteProperty(\"PSEventArgs.EventIdentifier\", e.EventIdentifier));
....
[/code:1]
Sinon il faut livrer la classe ET un fichier de type .ps1xml.
On peut passer par une méthode d'extension du C# 3.5, mais à la différence de PS cela nécessite une phase de compilation. Dans le cas de ton script cela n'apporte rien il me semble.
Richard Lazaro écrit:
En reprenant ton script et le modifiant comme indiqué :
[code:1]
$subnet = Get-Subnet 109.238.42.0/29 -Hosts
$subnet -is [psobject]
#True
$subnet -is [ThinkMs.Subnet]
#True
$Subnet.PsObject.TypeNames
#ThinkMs.Subnet
#System.Object
$Subnet.psbase.GetType()
# IsPublic IsSerial Name BaseType
#
----
# True False Subnet System.Object
$Subnet.psObject.GetType()
# IsPublic IsSerial Name BaseType
#
----
# True False PSObject System.Object
$Subnet.psobject.ImmediateBaseObject.GetType() # -eq $Subnet.psbase.PSBase
# IsPublic IsSerial Name BaseType
#
----
# True False Subnet System.Object
$subnet -is [psobject]
#True
$i -is [psobject]
#False
$i=10
$i -is [psobject]
#False
$i=$i -as [psobject]
$i -is [psobject]
#True
function Test([ThinkMs.Subnet] $P) {$subnet|select c*}
Test $Subnet.psobject.ImmediateBaseObject
#ok
Test $Subnet.psobject.BaseObject
#ok
Test ($Subnet -as [PSObject])
#Ok
Test $Subnet.PSBase
#error -> PSMemberSet
[/code:1]
On ne perd rien, on ajoute
L'objet doit être au préalable adapté :Ce qu'il faut surtout arriver à trouver, c'est savoir si il est possible de créer un alias dans une classe C#
[code:1]
#via Reflector.exe sur les assemblies de PS v2
internal static RemoteDataObject GeneratePSEventArgs(Guid clientRunspacePoolId, PSEventArgs e)
{
using (_trace.TraceMethod())
{
PSObject data = CreateEmptyPSObject();
data.Properties.Add(new PSNoteProperty(\"PSEventArgs.EventIdentifier\", e.EventIdentifier));
....
[/code:1]
Sinon il faut livrer la classe ET un fichier de type .ps1xml.
On peut passer par une méthode d'extension du C# 3.5, mais à la différence de PS cela nécessite une phase de compilation. Dans le cas de ton script cela n'apporte rien il me semble.
Richard Lazaro écrit:
Je ne suis pas sûr de comprendre, le type n'est pas perdu ( voir le pattern Adapter).cela permettrait un Binding de Cmdlet sans perdre le type de l'objet.
En reprenant ton script et le modifiant comme indiqué :
[code:1]
$subnet = Get-Subnet 109.238.42.0/29 -Hosts
$subnet -is [psobject]
#True
$subnet -is [ThinkMs.Subnet]
#True
$Subnet.PsObject.TypeNames
#ThinkMs.Subnet
#System.Object
$Subnet.psbase.GetType()
# IsPublic IsSerial Name BaseType
#
----
# True False Subnet System.Object
$Subnet.psObject.GetType()
# IsPublic IsSerial Name BaseType
#
----
# True False PSObject System.Object
$Subnet.psobject.ImmediateBaseObject.GetType() # -eq $Subnet.psbase.PSBase
# IsPublic IsSerial Name BaseType
#
----
# True False Subnet System.Object
$subnet -is [psobject]
#True
$i -is [psobject]
#False
$i=10
$i -is [psobject]
#False
$i=$i -as [psobject]
$i -is [psobject]
#True
function Test([ThinkMs.Subnet] $P) {$subnet|select c*}
Test $Subnet.psobject.ImmediateBaseObject
#ok
Test $Subnet.psobject.BaseObject
#ok
Test ($Subnet -as [PSObject])
#Ok
Test $Subnet.PSBase
#error -> PSMemberSet
[/code:1]
On ne perd rien, on ajoute
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Richard Lazaro
- Hors Ligne
- Membre platinium
Réduire
Plus d'informations
- Messages : 530
- Remerciements reçus 0
il y a 13 ans 8 mois #7506
par Richard Lazaro
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Réponse de Richard Lazaro sur le sujet Re:[Function PS v2] Replace-String
J'ai pas eu le temps de tester, je pensais que cela changé le type de l'objet à PSObject.
Donc c'est bien ce qu'on veut ... cela va bien m'aider dans mon projet actuel :]
Bon je pars modifier ma SCmdlet (ScriptCmdlet ^^).
Donc c'est bien ce qu'on veut ... cela va bien m'aider dans mon projet actuel :]
Bon je pars modifier ma SCmdlet (ScriptCmdlet ^^).
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
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 : 6302
- Remerciements reçus 68
il y a 13 ans 8 mois #7507
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:[Function PS v2] Replace-String
Une correction de mon dernier exemple à propos du typage des paramètres, je n'utilisais pas le paramètre :
[code:1]
function Test([ThinkMs.Subnet] $P) {$P|select c*}
Test $Subnet.psobject.ImmediateBaseObject
#nok
Test $Subnet.psobject.BaseObject
#nok
Test ($Subnet -as [PSObject])
#nOk
Test $Subnet.PSBase
#error
Test $Subnet
#nOk
function Test([PSObject]$P) {$P|select c*}
Test $Subnet.psobject.ImmediateBaseObject
#nok
Test $Subnet.psobject.BaseObject
#nok
Test ($Subnet -as [PSObject])
#Ok
Test $Subnet.PSBase
#Nok
Test $Subnet
#Ok
function Test([Object]$P) {$P|select c*}
Test $Subnet.psobject.ImmediateBaseObject
#nok
Test $Subnet.psobject.BaseObject
#ok
Test ($Subnet -as [PSObject])
#nOk
Test $Subnet.PSBase
#nok
Test $Subnet
#Ok
function Test($P) {$P|select c*}
Test $Subnet.psobject.ImmediateBaseObject
#nok
Test $Subnet.psobject.BaseObject
#ok
Test ($Subnet -as [PSObject])
#nOk
Test $Subnet.PSBase
#nok
Test $Subnet
#Ok
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 31/07/10 11:33
[code:1]
function Test([ThinkMs.Subnet] $P) {$P|select c*}
Test $Subnet.psobject.ImmediateBaseObject
#nok
Test $Subnet.psobject.BaseObject
#nok
Test ($Subnet -as [PSObject])
#nOk
Test $Subnet.PSBase
#error
Test $Subnet
#nOk
function Test([PSObject]$P) {$P|select c*}
Test $Subnet.psobject.ImmediateBaseObject
#nok
Test $Subnet.psobject.BaseObject
#nok
Test ($Subnet -as [PSObject])
#Ok
Test $Subnet.PSBase
#Nok
Test $Subnet
#Ok
function Test([Object]$P) {$P|select c*}
Test $Subnet.psobject.ImmediateBaseObject
#nok
Test $Subnet.psobject.BaseObject
#ok
Test ($Subnet -as [PSObject])
#nOk
Test $Subnet.PSBase
#nok
Test $Subnet
#Ok
function Test($P) {$P|select c*}
Test $Subnet.psobject.ImmediateBaseObject
#nok
Test $Subnet.psobject.BaseObject
#ok
Test ($Subnet -as [PSObject])
#nOk
Test $Subnet.PSBase
#nok
Test $Subnet
#Ok
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 31/07/10 11:33
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 : 6302
- Remerciements reçus 68
il y a 13 ans 7 mois #7642
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:[Function PS v2] Replace-String
Mise à jour, v1.1.0.
-Usage des méthodes de $PSCmdlet (le fonctionnement de -Debug est différent)
-Corrections mineures dans la doc.
-Correction d'un bug lors du redéclenchement d'une exception. Le constructeur d'une exception peut être d'accès privé .
-Fichier de test complété.
Pour info :
Dans le code d'un délégué( scriptblock), il est possible de modifier dynamiquement les propriétés de l'objet courant (cas d'utilisation rare, mais cela reste possible).
On peut utiliser les jokers PowerShell pour déclarer les propriétés à modifier :
[code:1]
#sur un objet fichier
$WildcardsProperties=@(
#renvoi :
\"PS*\", #6 propriétés
\"name\", #1 propriété
\"??????\", #3 propriétés
\"Last*Time\", #2 propriétés
\"[ba]*\" #2 propriétés
)[/code:1]
Si la recherche porte sur du texte contenant des regex on doit échapper les métacaractères à l'aide de la méthode statique :
[code:1]
[System.Text.RegularExpressions.Regex]::Escape('(?im-s)$test')+'(=.*)'
[/code:1]
Voir le fichier de test pour le détail de ces derniers points.
-Usage des méthodes de $PSCmdlet (le fonctionnement de -Debug est différent)
-Corrections mineures dans la doc.
-Correction d'un bug lors du redéclenchement d'une exception. Le constructeur d'une exception peut être d'accès privé .
-Fichier de test complété.
Pour info :
Dans le code d'un délégué( scriptblock), il est possible de modifier dynamiquement les propriétés de l'objet courant (cas d'utilisation rare, mais cela reste possible).
On peut utiliser les jokers PowerShell pour déclarer les propriétés à modifier :
[code:1]
#sur un objet fichier
$WildcardsProperties=@(
#renvoi :
\"PS*\", #6 propriétés
\"name\", #1 propriété
\"??????\", #3 propriétés
\"Last*Time\", #2 propriétés
\"[ba]*\" #2 propriétés
)[/code:1]
Si la recherche porte sur du texte contenant des regex on doit échapper les métacaractères à l'aide de la méthode statique :
[code:1]
[System.Text.RegularExpressions.Regex]::Escape('(?im-s)$test')+'(=.*)'
[/code:1]
Voir le fichier de test pour le détail de ces derniers points.
La pièce jointe Replace_String-0bc288db0de44bef1f53f26ec938d029.zip est absente ou indisponible
Tutoriels PowerShell
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.089 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- [Function PS v2] Replace-String