Question [Function PS v2] Replace-String

Plus d'informations
il y a 13 ans 8 mois #7503 par Laurent Dardenne
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]

Tutoriels PowerShell

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

Plus d'informations
il y a 13 ans 8 mois #7504 par Richard Lazaro
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 :whistle:

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.

Plus d'informations
il y a 13 ans 8 mois #7505 par Laurent Dardenne
Richard Lazaro écrit:

Ce qu'il faut surtout arriver à trouver, c'est savoir si il est possible de créer un alias dans une classe C#

L'objet doit être au préalable adapté :
[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:

cela permettrait un Binding de Cmdlet sans perdre le type de l'objet.

Je ne suis pas sûr de comprendre, le type n'est pas perdu ( voir le pattern Adapter).
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.

Plus d'informations
il y a 13 ans 8 mois #7506 par Richard Lazaro
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 ^^).

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.

Plus d'informations
il y a 13 ans 8 mois #7507 par Laurent Dardenne
Une correction de mon dernier exemple à propos du typage des paramètres, je n'utilisais pas le paramètre :whistle: :
[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.

Plus d'informations
il y a 13 ans 7 mois #7642 par Laurent Dardenne
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é :whistle: .
-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 :
\&quot;PS*\&quot;, #6 propriétés
\&quot;name\&quot;, #1 propriété
\&quot;??????\&quot;, #3 propriétés
\&quot;Last*Time\&quot;, #2 propriétés
\&quot;[ba]*\&quot; #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

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

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