Question Perdu dans les Objets et leurs collections...

Plus d'informations
il y a 8 ans 10 mois #23685 par Herbuel
Bonjour,

Histoire de me faire les dents, j'aimerais fabriquer une aide PS sous forme html...

Voici une idée du code global :

# Je récupère les commandes du type \"Cmdlet\"
# je limite à 5 items pour simplifier le test
Commands = Get-Command | Where-Object {$_.CommandType -eq \"Cmdlet\"} | Select-Object -First 5

# Je récupère les noms de ces commandes
$itemsName = $Commands | Select Name

# Je récupère l'aide de chaque commande
$itemsHelp = $itemsName | Get-Help -Full

# Je me fais une variable qui va contenir le Body de la page HTML que je vais générer plus tard
# Je lui mets un titre H1 en passant...
$Body = \"\"
$Body += \"<H1>Power Shell Help</H1>\"

# Dans cette boucle, l'idée est de scanner les propriétés qui m'intéressent. Plus tard, je compte effectuer des traitements spécifiques sur chacune de ces propriétés
# Je ne sélectionne que les propriétés qui m'intéressent
ForEach ($itemHelp in $itemsHelp | select Name, Category, ModuleName, Description)
{
# Pour ce qui est de les afficher sur le Host, pas de problème !
# Ces 3 propriétés sont des String
Write-Host
Write-Host \"Name : \" $itemHelp.Name
Write-Host \"Category : \" $itemHelp.Category
Write-Host \"ModuleName : \" $itemHelp.ModuleName

# $i me sert à construire l'objet contenant les infos de chaque Commande
$i = $null

$Body += \"<H2>$($itemHelp.name)</H2>\"

# C'est là où çà se complique !
# Je n'arrive pas à utiliser les valeurs des propriétés ci-dessus, et encore moins la Description qui semble être sous une forme de collection d'objet en sortie de l'aide PS

$body += $i | ConvertTo-Html -Fragment
}

# Fabrication de la page HTML globale
ConvertTo-HTML -Body $Body -Title \"Power Shell - Aide\" | Out-File \"PS-Help.html\"


Je sens qu'il y a un problème de type et d'indirection quand j'adresse les différentes propriétés, mais impossible d'aboutir ! Could you Help ? Merci Alain

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

Plus d'informations
il y a 8 ans 10 mois #23686 par Laurent Dardenne
Salut,
Herbuel écrit:

# C'est là où çà se complique !
# Je n'arrive pas à utiliser les valeurs des propriétés ci-dessus

Tu veux dire avec le cmdlet ConvertTo-HTML ?
Herbuel écrit:

et encore moins la Description qui semble être sous une forme de collection d'objet en sortie de l'aide PS

2 outils : le cmdlet Get-member pour le détail de l'objet et $Objet.GetType pour le type.
Ici PSObject[], donc un tableau :
[code:1]$itemHelp.Description[0].Text[/code:1]
Effectivement Get-Help structure sa sortie d'une certaine manière, à l'origine c'est du XML ( MAML ).

Tutoriels PowerShell

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

Plus d'informations
il y a 8 ans 10 mois #23687 par Herbuel
Merci pour ces pistes ! Cà m'a permis de réaliser que je ne fabriquais pas le bon objet pour donner à manger à Convertto-html :o)

J'arrive donc à ce type de code :

[code:1]
# Je fabrique la collection d'objets qui contient mes aides en ligne
$Commands = Get-Command | Where-Object {$_.CommandType -eq \"Cmdlet\"} | Select-Object -First 5
$itemsName = $Commands | Select Name
$itemsHelp = $itemsName | Get-Help -Full

# Le Body avec des entêtes...
$Body = \"\"
$Body += \"<H1>Power Shell Help</H1>\"
$Body += \"<H2>Commandes : Cmdlet</H2>\"

# Itérations sur chaque items d'aide
ForEach ($itemHelp in $itemsHelp | select Name, Category, ModuleName, Description, details, examples, inputTypes, nonTerminatingErrors, parameters, relatedLinks, returnValues, Synopsis, syntax, terminatingErrors)
{

$description = $itemHelp.Description.Text
Write-Host \"$description\" : $description

# Propriétés de l'objet correspondant à chaque item
$prop = @{
Name=$itemHelp.Name ;
Category=$itemHelp.Category ;
Description=$description ;
ModuleName=$itemHelp.ModuleName ;
Synopsis=$itemHelp.Synopsis ;
examples=$itemHelp.examples
}

# Objet correspondant à chaque item
$obj = New-Object -TypeName PSObject -Property $prop

$Body += \"<H3>$($itemHelp.name)</H3>\"
$body += $obj | ConvertTo-Html -Fragment -As List
}

# Fichier d'aide en HTML
ConvertTo-HTML -Body $Body -Title \"Power Shell - Aide\" -As List| Out-File \"PS-Help.html\"

[/code:1]

Tout ce passe bien tant que je suis avec des propriétés de type String. Mais même pour des propriétés qui paraissent \"simples\" comme Description, j'ai en sortie le type de l'objet et pas son contenu !
Ex : description NoteProperty psobject[] description=System.Management.Automation.PSObject[]

Idem pour les autres propriétés de ces objets Aide... Comme tu le dis, les sorties de Get-Member viennent de sources XML ! Au fait, savez vous si les sources XML des aides PS de MS sont disponibles quelque part ?

Merci Alain Herbuel

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

Plus d'informations
il y a 8 ans 10 mois #23688 par Laurent Dardenne
Herbuel écrit:

j'ai en sortie le type de l'objet et pas son contenu !

J'utilise peu ce cmdlet. La doc offline indique qu'il se base sur les propriétés du premier objet reçu, peut être faut-il créer autant de fragment que d'objet ?
Le mieux est de consulter ce document 'Creating HTML Reports in PowerShell' .
Herbuel écrit:

Au fait, savez vous si les sources XML des aides PS de MS sont disponibles quelque part ?

Dans le répertoire d'installation de PS
[code:1]
cd $pshome
[/code:1]
Voir aussi ce site github

Tutoriels PowerShell

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

Plus d'informations
il y a 8 ans 9 mois #23703 par Herbuel
Merci pour ces pistes... Je ne manquerais pas de poster un petit retour sur ce fil de discussion lorsque j'aurais compris tout cela :o)

En fait, je réalise maintenant que mes difficultés sont relatives à la navigation dans des collections d'objets contenant eux mêmes des objets complexes (et donc pas forcément de simples String), surtout lorsque ces objet sont un peu \"exotiques\" :o)

Pendant que j'y suis, bravo pour vos deux ouvrages ;o) Très intéressants et pertinent pour faire le tour des possibilités de PS ;o)

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

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