Question
Modification tableau existant
- Koubiacz
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 6
- Remerciements reçus 0
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
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- NicolasBdn
-
- Hors Ligne
- Membre senior
-
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.
- Koubiacz
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 6
- Remerciements reçus 0
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.
- Koubiacz
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 6
- Remerciements reçus 0
[code:1]# -- VARIABLES -- #
$ErrorActionPreference = 'stop'
$scriptdir = Split-Path -Path $MyInvocation.MyCommand.Path
$ficherr = \"$scriptdir\imprim_error.ini\"
$detailerr = Get-content $ficherr
$tablimprim = @()
# -- SCRIPT -- #
clear
$script:«»pc = Read-Host \"Nom de la machine\"
$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 \"Erreur\" -MemberType NoteProperty -Value \"\"
$tablimprim =+ $colerr
$nl = 0
$colonecode = $infoimprim | select DetectedErrorState
foreach($ligne in $script:colonecode)
{
foreach($lignfich in $detailerr)
{
$col = $lignfich.split(\",\"«»)
$numerr = $col[0]
$deserr = $col[1]
if ($numerr -eq $colonecode[$nl].detectederrorstate)
{
Write-Host $deserr
$colerr | Add-Member -Name \"Erreur\" -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 \"@{Erreur=}\" value of type \"System.Management.Automation.PSCustomObject\" to type \"System.Int32\".
At C:\Users\COURJEAU-55220\Desktop\script_imprim\imprim14042016.ps1:line:64 char:15
+ $tablimprim =+ <<<< $colerr
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
merci de nous avoir donné un message d'erreurMaintenant j'ai une erreur :
Cannot convert the \"@{Erreur=}\" value of type \"System.Management.Automation.PSCustomObject\" to type \"System.Int32\".
At C:Usersxxxxxx-55220Desktopscript_imprimimprim14042016.ps1:line:64 char:15
+ $tablimprim =+ <<<< $colerr
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
NicolasB t'avais bien aiguillé, tout tourne autour des objetsje n'arrive pas à comprendre pourquoi je n'y arrive pas.
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 \"DetectedErrorState\" du reste de \"tablimprim\", c'est une erreur qui ne t'aide pas et qui peut parfois causé des problèmes
fais une boucle sur objet \"$tablimprim\" et accède à \"DetectedErrorState\" 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
pas de problèmeMerci à ceux qui peuvent m'aider,
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.
- Koubiacz
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 6
- Remerciements reçus 0
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.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Modification tableau existant