Question Stocker un tableau dans un XML

Plus d'informations
il y a 13 ans 11 mois #11491 par SiSMik
Bonjour,

J'aime bien farfouiller dans les méandres du net et trouver mon bonheur, mais là je bute sur un os...

Dans mon script je crée des tableaux d'objets personnalisés comme celui ci
[code:1]# function create an array for Services
function Add-Service {
param([string]$name,[string]$status)
$d = New-Object PSObject
$d | Add-Member -Name name -MemberType NoteProperty -Value $name
$d | Add-Member -Name status -MemberType NoteProperty -Value $status
return $d
}[/code:1]

Ce qui me permet ensuite avec une commande comme celle-ci de remplir tableau:
[code:1]$Service = @()
Get-Service | % { $Service += Add-Service -name $_.Name -status $_.Status[/code:1]

Seulement, j'aimerais bien exporter cette variable dans un fichier XML pour qu'il soit traiter par d'autres applications en interne ici.


J'ai essayé plusieurs méthodes, qui chacunes donnent un résultat différent, mais pas bon du tout.

Par exemple:
[code:1](Get-Service | % { $Service += Add-Service -name $_.Name -status $_.Status } | ConvertTo-XML).Save(\"C:\testounet.xml\"«»)[/code:1]

[code:1]Get-Service | % { $Service += Add-Service -name $_.Name -status $_.Status } | Export-Clixml -Path C:\testounet.xml -Depth 2[/code:1]

Dans les deux cas, le fichier XML est créé avec l'entête, mais je ne vois pas le contenu de ma variable.

Je dois sûrement merdouillé quelque part.

Si vous avez des idées, je suis preneur !

merci d'avance

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

Plus d'informations
il y a 13 ans 11 mois #11494 par Richard Lazaro
Bonjour,

Le comportement est normal, vous avez un soucis dans l'utilisation du pipeline.

Je vais détailler chaque étape :

Get-Service : Va retourner dans le pipeline une liste d'objet service.


Get-Service | % { $Service += Add-Service -name $_.Name -status $_.Status } : % ou ForEach-Object va recupérer chaque objet du pipeline un à un et exécuter le scriptblock. Ici le scriptblock va créer l'objet custom et l'ajouter au tableau $Service.

Et c'est là où le problème se situe : ce scriptblock ne retourne aucune donnée en sortie !

Donc le pipeline derrière la commande précédente sera vide, donc la commande enchainé n'aura pas de données en entrée.

Voilà la boucle est bouclé.

Deux solutions :

[code:1]
$Service = @()
Get-Service | % { $Service += Add-Service -name $_.Name -status $_.Status }
$Service | Export-Clixml -Path C:\testounet.xml -Depth 2
[/code:1]

ou

[code:1]
$Service = @()
Get-Service | % { Add-Service -name $_.Name -status $_.Status } | Export-Clixml -Path C:\testounet.xml -Depth 2
[/code:1]

Dans le deuxième cas, nous n'avons plus la variable $Service.

Bien Cordialement,
Richard Lazaro.

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 11 mois #11496 par SiSMik
Réponse de SiSMik sur le sujet Re:Stocker un tableau dans un XML

ce scriptblock ne retourne aucune donnée en sortie !


C'est d'une évidence une fois que c'est dit !! :blush:

Merci ça m'enlève une bonne épine du pied !<br><br>Message édité par: benduru, à: 11/04/12 10:33

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

Plus d'informations
il y a 13 ans 11 mois #11564 par vlb
Réponse de vlb sur le sujet Re:Stocker un tableau dans un XML
Bonjour,

En parlant d'épine, j'en une bonne dans le pied...
Dans la même idée, ajouter un tableau dans une balise d'une fichier xml déjà existant.

Je peux sans difficulter ajouter un 'string' manuellement via l'appel du noeud.

$xml.applis.environments=\&quot;FOO\&quot;

Mais je scrute lecteur pour ajouter un tableau de 'string'.

Le tableau à ajouter est le résultat de
$name = (ls -name F:\), de 1 à n répertoires.

J'ai besoin de rajouter tous les répertoires à la racine de F:\ (qui peuvent évoluer dans le temps), et les intégrer dans la balise 'environments' du fichier xml.

Bien sur, je suis bloqué sur un problème de type tout bète, mais j'arrive pas à le convertir.

Je me suis inspiré de ce site pour ajouter mon 'tab', mais mon message d'erreur est sans appel.
powershell.com/cs/blogs/tobias/archive/2...change-xml-data.aspx


[code:1]
$template = @'
&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot; ?&gt;
&lt;APPLIS&gt;
&lt;ENVIRONMENTS /&gt;
&lt;/APPLIS&gt;
'@

$template | out-file C:\Applis.xml -Encoding UTF8

$xml = New-Object xml
$xml.load(\&quot;C:\Applis.xml\&quot;«»)

$name = (ls -name F:\)
foreach-Object {
#si au passage on pouvait m'expliquer ce que fait le #clone...
$newenv = $newenv.clone()
$newenv.environment = $_
$xml.applis.AppendChild($newenv)
}
[/code:1]

Les message d'erreur qui va bien :

Impossible de définir « ENVIRONMENTS », car seules des chaînes peuvent être utilisées en tant que valeurs pour définir des propriétés XmlNode.

Par la suite j'en ferai une fonction.

Merci pour votre aide.

Vincent<br><br>Message édité par: suchiwa, à: 19/04/12 11:03

Vincent

Dans le doute, reboot...

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

Plus d'informations
il y a 13 ans 11 mois #11565 par vlb
Réponse de vlb sur le sujet Re:Stocker un tableau dans un XML
Peut être un début de réponse avec

$name = $name -as [string]

A voir


suchiwa écrit:

Bonjour,

En parlant d'épine, j'en une bonne dans le pied...
Dans la même idée, ajouter un tableau dans une balise d'une fichier xml déjà existant.

Je peux sans difficulter ajouter un 'string' manuellement via l'appel du noeud.

$xml.applis.environments=\&quot;FOO\&quot;

Mais je scrute lecteur pour ajouter un tableau de 'string'.

Le tableau à ajouter est le résultat de
$name = (ls -name F:\), de 1 à n répertoires.

J'ai besoin de rajouter tous les répertoires à la racine de F:\ (qui peuvent évoluer dans le temps), et les intégrer dans la balise 'environments' du fichier xml.

Bien sur, je suis bloqué sur un problème de type tout bète, mais j'arrive pas à le convertir.

Je me suis inspiré de ce site pour ajouter mon 'tab', mais mon message d'erreur est sans appel.
powershell.com/cs/blogs/tobias/archive/2...change-xml-data.aspx


[code:1]
$template = @'
&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot; ?&gt;
&lt;APPLIS&gt;
&lt;ENVIRONMENTS /&gt;
&lt;/APPLIS&gt;
'@

$template | out-file C:\Applis.xml -Encoding UTF8

$xml = New-Object xml
$xml.load(\&quot;C:\Applis.xml\&quot;«»)

$name = (ls -name F:\)
foreach-Object {
#si au passage on pouvait m'expliquer ce que fait le #clone...
$newenv = $newenv.clone()
$newenv.environment = $_
$xml.applis.AppendChild($newenv)
}
[/code:1]

Les message d'erreur qui va bien :

Impossible de définir « ENVIRONMENTS », car seules des chaînes peuvent être utilisées en tant que valeurs pour définir des propriétés XmlNode.

Par la suite j'en ferai une fonction.

Merci pour votre aide.

Vincent&lt;br&gt;&lt;br&gt;Message édité par: suchiwa, à: 19/04/12 11:03


Vincent

Dans le doute, reboot...

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

Plus d'informations
il y a 13 ans 11 mois #11567 par vlb
Réponse de vlb sur le sujet Re:Stocker un tableau dans un XML
Je pense que j'ai trouvé.

L'erreur est bien dans le tableau à intégrer, il faut le convertir:
[code:1]
$name = (ls -name F:\) -as [string]
[/code:1]

Ensuite, mon tableau se suffit à lui même, donc pas besoin d'un foreach.

Le clone en question, faite une copie (bref, un clone...) modifie puis ajoute en plus, ce que je ne veux pas, je veux modifier le champs sans pour autant ajouter un second champs, donc le clone() à la poubelle.

Je manipule directement, peut être peut on me proposer plus propre, mais ça marche :

[code:1]
# create a template XML to hold data
$template = @'
&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot; ?&gt;
&lt;APPLIS
&lt;ENVIRONMENTS /&gt;
&lt;/APPLIS&gt;
'@
$template | Out-File \&quot;C:\env.xml\&quot; -encoding UTF8
# load template into XML object
$xml = New-Object xml
$xml.Load(\&quot;C:\env.xml\&quot;«»)
# use template to add folders to xml
$name = (ls -name F:\) -as [string]
$xml.applis.environments = $name
# save xml to file
$xml.Save(\&quot;C:\env.xml\&quot;«»)
[/code:1]
















suchiwa écrit:

Peut être un début de réponse avec

$name = $name -as [string]

A voir


suchiwa écrit:

Bonjour,

En parlant d'épine, j'en une bonne dans le pied...
Dans la même idée, ajouter un tableau dans une balise d'une fichier xml déjà existant.

Je peux sans difficulter ajouter un 'string' manuellement via l'appel du noeud.

$xml.applis.environments=\&quot;FOO\&quot;

Mais je scrute lecteur pour ajouter un tableau de 'string'.

Le tableau à ajouter est le résultat de
$name = (ls -name F:\), de 1 à n répertoires.

J'ai besoin de rajouter tous les répertoires à la racine de F:\ (qui peuvent évoluer dans le temps), et les intégrer dans la balise 'environments' du fichier xml.

Bien sur, je suis bloqué sur un problème de type tout bète, mais j'arrive pas à le convertir.

Je me suis inspiré de ce site pour ajouter mon 'tab', mais mon message d'erreur est sans appel.
powershell.com/cs/blogs/tobias/archive/2...change-xml-data.aspx


[code:1]
$template = @'
&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot; ?&gt;
&lt;APPLIS&gt;
&lt;ENVIRONMENTS /&gt;
&lt;/APPLIS&gt;
'@

$template | out-file C:\Applis.xml -Encoding UTF8

$xml = New-Object xml
$xml.load(\&quot;C:\Applis.xml\&quot;«»)

$name = (ls -name F:\)
foreach-Object {
#si au passage on pouvait m'expliquer ce que fait le #clone...
$newenv = $newenv.clone()
$newenv.environment = $_
$xml.applis.AppendChild($newenv)
}
[/code:1]

Les message d'erreur qui va bien :

Impossible de définir « ENVIRONMENTS », car seules des chaînes peuvent être utilisées en tant que valeurs pour définir des propriétés XmlNode.

Par la suite j'en ferai une fonction.

Merci pour votre aide.

Vincent&lt;br&gt;&lt;br&gt;Message édité par: suchiwa, à: 19/04/12 11:03


Vincent

Dans le doute, reboot...

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

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