Question Modification tableau existant

Plus d'informations
il y a 9 ans 11 mois #21676 par Koubiacz
Salut,
Je suis en train de créer un script qui récupère les informations sur les imprimantes connectés sur des postes distants.

Le résultat est affiché sous forme de tableau. J'utilise le tableau généré par WmiObject win32_printer et je me suis juste contenté de renommer les colones

Je galère pas mal pour la dernière étape, je souhaiterai afficher les correspondance (contenues dans un ficher texte) aux codes d'erreurs ex: code 5 - Toner vide, en ajoutant une colonne à la fin du tableau qui contient les résultat du fichier texte

J'ai joint une image pour montrer le résultat que j'ai actuellement.
Mon problème est que je n'arrive pas a rajouter les valeurs affichés dans à la suite du tableau.

Merci à ceux qui peuvent m'aider, je n'arrive pas à comprendre pourquoi je n'y arrive pas.

[code:1]# -- VARIABLES -- #
$ErrorActionPreference = 'stop'
$scriptdir = Split-Path -Path $MyInvocation.MyCommand.Path
$ficherr = \"$scriptdir\imprim_error.ini\"
$detailerr = Get-content $ficherr
$global:tablfinal = @()


# -- FONCTIONS -- #

#Test connection machine
function testcon
{
Try
{
$global:infoimprim = Get-WmiObject win32_printer -ComputerName $global:«»pc
}
Catch
{
Write-Warning \"Machine impossible à contacter !!\"
Start-Sleep -Seconds 10
exit
}
}

#identifications des code erreurs en fonction de imprim_error.ini
function identerr
{
$nl = 0
$global:colonecode = $global:infoimprim | select DetectedErrorState
foreach($ligne in $global:colonecode)
{
foreach($lignfich in $detailerr)
{
$col = $lignfich.split(\",\"«»)
$numerr = $col[0]
$deserr = $col[1]
if ($numerr -eq $global:colonecode[$nl].detectederrorstate)
{
Write-output $deserr # a titre de test
$global:tablimprim | Add-Member -Name \"Erreur\" -MemberType NoteProperty -Value $deserr
$global:tablfinal += $global:infoimprim
$nl = $nl +1
}
}
}
}

# -- SCRIPT -- #
clear
$global:«»pc = Read-Host \"Nom de la machine\"
testcon
$global:tablfinal = $global:infoimprim | select @{Name='Nom';Expression = {$_.caption}},@{Name='Port/IP';Expression = {$_.Portname}},@{Name='Par défaut';Expression = {$_.default}},@{Name='Code Erreur';Expression = {$_.DetectedErrorState}}
$global:tablimprim = New-Object Psobject
$global:tablimprim | Add-Member -Name \"Erreur\" -MemberType NoteProperty -Value \"\"
identerr
$global:tablfinal | ft -AutoSize 'Nom','Port/IP','Par défaut','Code Erreur','Erreur'[/code:1]
Edit : Il n'y a que 4 erreurs d'affiché dans la capture d'écran, mais le script affiche bien les 5, j'ai coupé trop bas quand j'ai fait la capture.<br><br>Message édité par: Koubiacz, à: 12/04/16 11:25

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

Plus d'informations
il y a 9 ans 11 mois #21683 par NicolasBdn
Réponse de NicolasBdn sur le sujet Re:Modification tableau existant
Ton code me paraît un peu trop compliqué pour ce que tu cherches à faire, avec l'utilisation des $global: c'est des coup à plus savoir où tu en es (avis perso).

Tu devrais juste passer des objets en paramètres de tes fonctions, puis retourner un nouvel objet.

J'espère t'avoir aiguillé.

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

Plus d'informations
il y a 9 ans 11 mois #21684 par Koubiacz
Réponse de Koubiacz sur le sujet Re:Modification tableau existant
Merci pour l'astuce, j'avais rajouté des global pour essayer de faire fonctionner le script (je l'ai laissé de coté ces derniers jour par manque de temps)
J'ai fait plusieurs essais, mais vu que ça fonctionnait pas, j'ai supprimé ces lignes de codes.

Par contre comment ajouter l’objet que je vais créer qui contiendra les descriptions des codes d'erreurs à la suite du tableau??

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

Plus d'informations
il y a 9 ans 11 mois #21685 par Koubiacz
Réponse de Koubiacz sur le sujet Re:Modification tableau existant
N'ayant pas trop d'explications pour passer un objet en argument, j'ai décidé de carrément supprimer la fonction.

[code:1]# -- VARIABLES -- #
$ErrorActionPreference = 'stop'
$scriptdir = Split-Path -Path $MyInvocation.MyCommand.Path
$ficherr = \&quot;$scriptdir\imprim_error.ini\&quot;
$detailerr = Get-content $ficherr
$tablimprim = @()



# -- SCRIPT -- #
clear
$script:«»pc = Read-Host \&quot;Nom de la machine\&quot;
$tablimprim = $infoimprim | select @{Name='Nom';Expression = {$_.caption}},@{Name='Port/IP';Expression = {$_.Portname}},@{Name='Par défaut';Expression = {$_.default}},@{Name='Code Erreur';Expression = {$_.DetectedErrorState}}
#$colerr = New-Object psobject
$colerr | Add-Member -Name \&quot;Erreur\&quot; -MemberType NoteProperty -Value \&quot;\&quot;
$tablimprim =+ $colerr
$nl = 0
$colonecode = $infoimprim | select DetectedErrorState
foreach($ligne in $script:colonecode)
{
foreach($lignfich in $detailerr)
{
$col = $lignfich.split(\&quot;,\&quot;«»)
$numerr = $col[0]
$deserr = $col[1]
if ($numerr -eq $colonecode[$nl].detectederrorstate)
{
Write-Host $deserr
$colerr | Add-Member -Name \&quot;Erreur\&quot; -MemberType NoteProperty -Value $deserr
$tablimprim =+ $colerr
$nl = $nl +1
}
}
}
$tablimprim | ft -AutoSize 'Nom','Port/IP','Par défaut','Code Erreur','Erreur'[/code:1]

Maintenant j'ai une erreur :
Cannot convert the \&quot;@{Erreur=}\&quot; value of type \&quot;System.Management.Automation.PSCustomObject\&quot; to type \&quot;System.Int32\&quot;.
At C:\Users\COURJEAU-55220\Desktop\script_imprim\imprim14042016.ps1:line:64 char:15
+ $tablimprim =+ &lt;&lt;&lt;&lt; $colerr

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

Plus d'informations
il y a 9 ans 11 mois #21687 par Philippe
Réponse de Philippe sur le sujet Re:Modification tableau existant
Bonjour Koubiacz

Maintenant j'ai une erreur :
Cannot convert the \&quot;@{Erreur=}\&quot; value of type \&quot;System.Management.Automation.PSCustomObject\&quot; to type \&quot;System.Int32\&quot;.
At C:Usersxxxxxx-55220Desktopscript_imprimimprim14042016.ps1:line:64 char:15
+ $tablimprim =+ &lt;&lt;&lt;&lt; $colerr

merci de nous avoir donné un message d'erreur
malheureusement ton extrait de code ne correspond pas a ton message, il indique une erreur sur la ligne 64, alors qu'il y a qu'une trentaine de ligne dans ton extrait
l'erreur indique que tu cherche convertir un objet en entier

je n'arrive pas à comprendre pourquoi je n'y arrive pas.

NicolasB t'avais bien aiguillé, tout tourne autour des objets
regarde le fonctionnement de add-member dans cette doc il y a des exemples a la fin
Cette commande ajoutent un membre (une colonne) a un objet
dans ta boucle tu rajoute plusieurs fois la même propriété dans ton objet

comme le dis Nicolas ton code est complexe pour ce qu'il fait et surtout contient une petite erreur de conception !
tu sépare la propriété/colonne \&quot;DetectedErrorState\&quot; du reste de \&quot;tablimprim\&quot;, c'est une erreur qui ne t'aide pas et qui peut parfois causé des problèmes
fais une boucle sur objet \&quot;$tablimprim\&quot; et accède à \&quot;DetectedErrorState\&quot; comme ceci par exemple :
[code:1]foreach($ligne in $tablimprim)
{
if ($numerr -eq $ligne.detectederrorstate)[/code:1]
et donc pour écrire la description de l'erreur tu fais ainsi
[code:1]$ligne.erreur = $deserr[/code:1]

je sais pas comment est constituer ton fichier contenant les descriptions d'erreurs, mais tu peut ici aussi simplifier ton code. je peut te donné plus d'info si tu veux

Merci à ceux qui peuvent m'aider,

pas de problème
pour plus d'info reviens nous voir !<br><br>Message édité par: 6ratgus, à: 15/04/16 10:38

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

Plus d'informations
il y a 9 ans 11 mois #21690 par Koubiacz
Réponse de Koubiacz sur le sujet Re:Modification tableau existant
Salut et merci pour vos retour.

Effectivement le numéro de l'erreur de correspond pas à la bonne ligne, car en fait le script est plus long que ça, il y'a une vérification pour savoir si la machine répond bien et une autre pour en cas d'erreur de saisie la recherche se fasses sur la machine locale.

Pour l'erreur de la ligne 64, c'est une boulette de ma part j'ai inversé le =+ et +=

J'ai remis le script en pièce jointe, mon fichier d'erreur est un bête fichier texte de la forme

0,Pas d'erreur
1,Autre/Inconnue
2,Pas d'erreur
3,Niveau papier bas
4,Papier vide
5,Niveau toner bas
6,Toner vide
7,Capot ouvert
8,Bourrage papier
9,Hors ligne
10,Maintenance nécessaire
11,Bac sortie papier plein

Je continue mes investigations, j'ai un bouquin Windows PowerShell v4 similaire a ceux présenté dans le site, il va falloir que je pense à le ressortir plus souvent ;)

La pièce jointe imprim.ps1 est absente ou indisponible

Pièces jointes :

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

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