Question Hash Table - Soigner la présentation (Résolu)

Plus d'informations
il y a 17 ans 3 mois #3352 par michault
Bonjour,

J'essaye de soigner la présentation de ma sortie sur un ancien script inspiré de ce que j'ai trouvé ici.
Les entêtes sont répétées sur chaque ligne.

[code:1]#GetfreespaceList.ps1
# Paramètres: $ouparm :L'Unité d'Organisation dont on veut récupérer les ordinateurs.
# $who : Quels PC exemple PC*
# $file : Fichier de sortie
# $log : Fichier error
Param($ouparm , $who, $file, $log)

#Définition des constantes
$domain = \",DC=domain,DC=fr\"
#$ErrorActionPreference = 'SilentlyContinue'

$OU= $ouparm + $domain
get-QADComputer -searchRoot $OU | Select-Object Name | where {$_.Name -like $who} |
ForEach-Object {

# Sortie fichier sous forme de table
Get-WmiObject -ComputerName $_.Name -Class Win32_LogicalDisk -ErrorAction SilentlyContinue -ErrorVariable wmierror|where {$_.DriveType -eq 3}| tee-object -Variable disques | select-object @{e={$_.systemname};n=\"Système\"} ,
@{e={$_.name};n=\"Disque\"} , @{e={[Math]::Round($_.size/1GB,1)}; n=\"Taille (Go)\"},
@{e={[Math]::Round($_.freespace/1GB,1)}; n=\"Disponible (Go)\"},@{e={[math]::round(([int64]$_.size-[int64]$_.freespace)/1GB,1)};n=\"Occupé (Go)\"},
@{e={[math]::round(([int64]$_.freespace/[int64]$_.size*100),0)};n=\"% restant\"} | Format-table | Out-File $file -Append -NoClobber
}[/code:1]


Je voudrai alimenter une hashtable pour avoir un fichier propre avec les entêtes une seule fois, mais n'arrive pas à alimenter cette table.


[code:1]#GetfreespaceList.ps1
# Paramètres: $ouparm :L'Unité d'Organisation dont on veut récupérer les ordinateurs.
# $who : Quels PC exemple PC*
# $file : Fichier de sortie
# $log : Fichier error
Param($ouparm , $who, $file, $log)

#Définition des constantes
$domain = \",DC=domaine,DC=fr\"
#$ErrorActionPreference = 'SilentlyContinue'

$OU= $ouparm + $domain
get-QADComputer -searchRoot $OU | Select-Object Name | where {$_.Name -like $who} |
ForEach-Object {

# Sortie fichier sous forme de table
$Objet = Get-WmiObject -ComputerName $_.Name -Class Win32_LogicalDisk -ErrorAction SilentlyContinue -ErrorVariable wmierror|where {$_.DriveType -eq 3}| tee-object -Variable disques | select-object @{e={$_.systemname};n=\"Système\"} ,
@{e={$_.name};n=\"Disque\"} , @{e={[Math]::Round($_.size/1GB,1)}; n=\"Taille (Go)\"},
@{e={[Math]::Round($_.freespace/1GB,1)}; n=\"Disponible (Go)\"},@{e={[math]::round(([int64]$_.size-[int64]$_.freespace)/1GB,1)};n=\"Occupé (Go)\"},
@{e={[math]::round(([int64]$_.freespace/[int64]$_.size*100),0)};n=\"% restant\"}

Write-Host $Objet

}[/code:1]


Voilà où j'en suis. La variable $Objet contient:
@{Système=PCXXXX; Disque=C:; Taille (Go)=74,5; Disponible (Go)=64; Occupé (Go)=10,4; % restant=86}
Je voudrai me débarrasser des labels et les reprendre au moment du chargement de la table.

C'est encore un peu costaud pour moi<br><br>Message édité par: Arnaud, à: 9/12/08 23:37

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

Plus d'informations
il y a 17 ans 3 mois #3355 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Hash Table
chm69 écrit:

Je voudrai alimenter une hashtable pour avoir un fichier propre avec les entêtes une seule fois

chm69 écrit:

Je voudrai me débarrasser des labels et les reprendre au moment du chargement de la table.

Je ne comprends pas ce que tu veux faire, tu veux enregistrer sur disque le contenu d'une hashtable ?

Tutoriels PowerShell

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

Plus d'informations
il y a 17 ans 3 mois #3356 par michault
Réponse de michault sur le sujet Re:Hash Table
Actuellement, ma sortie fichier a cette tête:
Disque Taille Disponible (Go) Occupé (Go) %restant




C: 100 70 10 70,00
Disque Taille Disponible (Go) Occupé (Go) %restant




C: 240 80 160 30,00

ETC....

Je voudrai

Disque Taille Disponible (Go) Occupé (Go) %restant




C: 100 70 10 70,00
C: 240 80 160 30,00

voir

Disque;Taille;Disponible (Go);Occupé (Go);%restant
C:;100;70;10;70,00
C:;240;80;160;30,00


voilà mais je sais pas faire

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

Plus d'informations
il y a 17 ans 3 mois #3357 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Hash Table
chm69 écrit:

voilà mais je sais pas faire

A prioris c'est simple
[code:1]
$objet|export-csv test.csv -encoding UTF8
[/code:1]
Il ne faut pas oublié que PS est basé objet et pas chaîne de caractères.
On doit, si possible, récupérer une collection d'objets et ne pas lier les traitements et la présentation (l'affichage) sauf les warning ou les logs.

Si je peux me permettre une remarque, tes scripts devraient renvoyer des objets et pas du texte, ils pourront ainsi s'insérer aisément dans des segments de pipeline. A mon avis le pb n'est pas que tu ne saches pas faire c'est plutôt que ta manière de faire ne peut que t'ammener ce genre de pb.
Il faut arriver à penser pipeline et objet mais pour ça faut changer les habitudes, pas facile...
;)

Tutoriels PowerShell

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

Plus d'informations
il y a 17 ans 3 mois #3366 par michault
Réponse de michault sur le sujet Re:Hash Table
J'ai un problème avec l'export-csv qui écrase le fichier résultant plutôt que d'ajouter le nouvel objet issu de get-wmiobject. Le out-file ne présente pas se problème mais ajoute les entêtes de colonnes à chaque coup.

Un mixte des 2 c'est pas possible:( ???

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

Plus d'informations
il y a 17 ans 3 mois #3367 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Hash Table
chm69 écrit:

J'ai un problème avec l'export-csv qui écrase le fichier résultant plutôt que d'ajouter le nouvel objet issu de get-wmiobject.

Si tu n'as pas suivi mon conseil c'est normal, procéde ainsi :
[code:1]
$Objets=get-QADComputer ..
[/code:1]
Ensuite si tu appelles ce script au sein d'une boucle cela ne marchera pas plus. Dans ce cas la construction de ta liste d'objet doit se faire dans le script appellant
chm69 écrit:

Un mixte des 2 c'est pas possible

Je ne pense pas. Il manque la fonctionnalité Append mais si l'équipe de dev de PS ne l'a pas ajouté c'est qu'il avait une bonne raison, la V2 n'offre pas plus de fonction.
Reste le bricolage de ce type là :
[code:1]
$First=test-path test.csv
if ($First)
{$Old= gc test.csv
$objet|export-csv test.csv -encoding UTF8 -noTypeInformation
$new= gc test.csv
$old,$new[1..($new.count-1)]|Set-content test.csv
}
else {$objet|export-csv test.csv -encoding UTF8}
[/code:1]
:sick:
Mais pour moi,ici tout indique que ta conception est à revoir. En procédant ainsi on ne régle pas le problème, on s'y adapte ;)

Tutoriels PowerShell

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

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