Question Stocker un tableau dans un XML
- SiSMik
- Auteur du sujet
- Hors Ligne
- Membre platinium
-
- Messages : 492
- Remerciements reçus 0
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.
- Richard Lazaro
- Hors Ligne
- Membre platinium
-
- Messages : 530
- Remerciements reçus 0
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.
- SiSMik
- Auteur du sujet
- Hors Ligne
- Membre platinium
-
- Messages : 492
- Remerciements reçus 0
ce scriptblock ne retourne aucune donnée en sortie !
C'est d'une évidence une fois que c'est dit !!
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.
- vlb
- Hors Ligne
- Membre junior
-
- Messages : 25
- Remerciements reçus 0
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=\"FOO\"
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 = @'
<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<APPLIS>
<ENVIRONMENTS />
</APPLIS>
'@
$template | out-file C:\Applis.xml -Encoding UTF8
$xml = New-Object xml
$xml.load(\"C:\Applis.xml\"«»)
$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.
- vlb
- Hors Ligne
- Membre junior
-
- Messages : 25
- Remerciements reçus 0
$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=\"FOO\"
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 = @'
<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<APPLIS>
<ENVIRONMENTS />
</APPLIS>
'@
$template | out-file C:\Applis.xml -Encoding UTF8
$xml = New-Object xml
$xml.load(\"C:\Applis.xml\"«»)
$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.
- vlb
- Hors Ligne
- Membre junior
-
- Messages : 25
- Remerciements reçus 0
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 = @'
<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<APPLIS
<ENVIRONMENTS />
</APPLIS>
'@
$template | Out-File \"C:\env.xml\" -encoding UTF8
# load template into XML object
$xml = New-Object xml
$xml.Load(\"C:\env.xml\"«»)
# use template to add folders to xml
$name = (ls -name F:\) -as [string]
$xml.applis.environments = $name
# save xml to file
$xml.Save(\"C:\env.xml\"«»)
[/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=\"FOO\"
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 = @'
<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<APPLIS>
<ENVIRONMENTS />
</APPLIS>
'@
$template | out-file C:\Applis.xml -Encoding UTF8
$xml = New-Object xml
$xml.load(\"C:\Applis.xml\"«»)
$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.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- Stocker un tableau dans un XML