Partage
  • Partager sur Facebook
  • Partager sur Twitter

[POWERSHELL]capture des numeros de serie d'ecran

    29 juillet 2022 à 11:01:40

    Bonjour,

    voici une super ligne powershell qui permet de récupérer les numéros de série des écrans branchés sur le pc :

    gwmi -computerName $nomPC WmiMonitorID -Namespace root\wmi | ForEach-Object {($_.SerialNumberID -ne 0 | foreach {[char]$_}) -join ''}

    cette ligne fonctionne bien, si le constructeur respecte les normes, ce qui n'est pas toujours le cas. Vous pouvez avoir un numéro de série incomplet si vous comparez avec l’étiquette.Je l'ai récupéré sur un site de microsoft.

    Mon souci c'est qu'elle est super complexe. Je voudrais mettre les numéros de série dans des cellules excel différente, voici mon script qui récupère les numéros de série et les met dans une même cellule excel :

    #variables---------------------------------------------------
    $nomPC=hostname
    $ligne=1
    
    
    #fonctions----------------------------------------------------
    function captureNumSerie()
    {
        $numSerie=gwmi -computerName $nomPC WmiMonitorID -Namespace root\wmi | ForEach-Object {($_.SerialNumberID -ne 0 | foreach {[char]$_}) -join ''}
        return $numSerie
    }
    
    
    
    #creation du fichier excel------------------------------------
    $excel = new-object -comobject Excel.Application
    $excel.visible = $true
    $excel.DisplayAlerts = $False
    
    
    $workbook = $excel.Workbooks.Add()
    $workbook = $workbook.Worksheets.Item(1)
    #-------------------------------------------------------------
    
    
    #formalisation du fichier excel-------------------------------
    $nomSecteur= Read-Host "Secteur réalisé : "
    $workbook.Cells.Item(1,1) = $nomSecteur
    
    
    
    #recherche de la derniere ligne du tableau (la premiere vide)
    Do{
        if($workbook.Cells.Item($ligne,1).text -ne "")
        {
            $ligne++   
        }
    }Until($workbook.Cells.Item($ligne,1).text -eq "")
    
    
    
    
    Do{
        $workbook.Cells.Item($ligne,1) = captureNumSerie
        $ligne++
        $recommencer= Read-Host "recommencer (n/y) : "
    }Until($recommencer -eq "n")
    
    
    write-host "Sauvegarde du fichier excel dans C:\inventaire\$nomSecteur.xlsx"
    #sauver un fichier excel
    $workbook.SaveAs("C:\inventaire\$nomSecteur.xlsx")


    Je ne comprends pas cette barre verticale, je la vois dans beaucoup de script. J'ai l'impression que c'est nécessaire quand on peut que cela tienne sur 1 ligne.

    on peut probablement exploiter les foreach, mais la syntaxe est troublante, si l'on peu transformer cette ligne en multi ligne plus clair , se serai peut être plus simple a comprendre et à exploiter, mais comment faire ?

    Autre souci je n'arrive pas a fermer mon fichier excel. faire $workbook.close(true) ne fonctionne pas, il ne connait pas la commande close.

    • Partager sur Facebook
    • Partager sur Twitter
      29 juillet 2022 à 15:04:23

      le | (algr+6) c'est un pipe, ça permet de passer le résultat d'une opération en entrée d'une autre opération

      Les foreach (imbriqués) font la conversion en caractère alphanumérique les valeurs du champ SerialNumberID de tous les écrans retournés.

      Donc ta fonction te retourne un tableau avec toutes les valeurs 

      $liste_moniteurs=gwmi -computerName $nomPC WmiMonitorID -Namespace root\wmi | ForEach-Object {($_.SerialNumberID -ne 0 | foreach {[char]$_}) -join ''}
      
      

      $liste_moniteurs[0] te renvoie le 1er
      $liste_moniteurs.length te renvoie la taille du tableau (si = 2 alors il y a les éléments d'indice 0 et 1 (=2-1), classiquement)

      Pour fermer tu peux faire 

      $excel.Workbooks.Close()
      $excel.Quit()
      • Partager sur Facebook
      • Partager sur Twitter
        1 août 2022 à 9:41:19

        ok je comprends mieux.

        je crois comprendre que

        $numSerie=gwmi -computerName $nomPC WmiMonitorID -Namespace root\wmi

        permet de créer un groupe d'objet contenant les informations des écrans. le | permet de passer ce groupe dans le ForEach-Object.

        Le 2eme | indique que c'est un foreach imbriqué. J'ai essayé de faire ça, qui ne fonctionne pas :

        $numSerie=gwmi -computerName $nomPC WmiMonitorID -Namespace root\wmi
        
        ForEach-Object ($numSerie.SerialNumberID -ne 0)
        {
            foreach ([char]$numSerie)
            {
                -join ''
            }
        }

        Je me rends compte que je ne comprends pas  {($_.SerialNumberID -ne 0 | foreach {[char]$_}) -join ''}

        D'une part le système { me semble étrange, habituellement on utilise des ().

        $_ qu'est ce qu'est c'est ? un raccourci pour signifié l'objet ?

        Pour le excel c'est ok ça me ferme ma fenêtre.

        -
        Edité par Deuvool 1 août 2022 à 9:55:44

        • Partager sur Facebook
        • Partager sur Twitter
          1 août 2022 à 10:40:15

          $_ c'est une variable automatique qui contient la donnée passé par le pipe (https://docs.microsoft.com/fr-fr/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-7.2#_ )

          par rapport à ton code initial, tu as peu de chose à modifier je pense (j'ai modifié ta dernière boucle)

          #variables---------------------------------------------------
          $nomPC=hostname
          $ligne=1
           
           
          #fonctions----------------------------------------------------
          function captureNumSerie()
          {
              $numSerie=gwmi -computerName $nomPC WmiMonitorID -Namespace root\wmi | ForEach-Object {($_.SerialNumberID -ne 0 | foreach {[char]$_}) -join ''}
              return $numSerie
          }
           
           
           
          #creation du fichier excel------------------------------------
          $excel = new-object -comobject Excel.Application
          $excel.visible = $true
          $excel.DisplayAlerts = $False
           
           
          $workbook = $excel.Workbooks.Add()
          $workbook = $workbook.Worksheets.Item(1)
          #-------------------------------------------------------------
           
           
          #formalisation du fichier excel-------------------------------
          $nomSecteur= Read-Host "Secteur réalisé : "
          $workbook.Cells.Item(1,1) = $nomSecteur
           
           
           
          #recherche de la derniere ligne du tableau (la premiere vide)
          Do{
              if($workbook.Cells.Item($ligne,1).text -ne "")
              {
                  $ligne++  
              }
          }Until($workbook.Cells.Item($ligne,1).text -eq "")
           
           
           
          $result=captureNumSerie
          $i=0
          for($i=0;$i -le $result.Count;i++){
              $workbook.Cells.Item($ligne,1) = $result[$i]
              $ligne++
          }
           
           
          write-host "Sauvegarde du fichier excel dans C:\inventaire\$nomSecteur.xlsx"
          #sauver un fichier excel
          $workbook.SaveAs("C:\inventaire\$nomSecteur.xlsx")
          $excel.Workbooks.Close()
          $excel.Quit()



          -
          Edité par umfred 1 août 2022 à 10:41:35

          • Partager sur Facebook
          • Partager sur Twitter
            1 août 2022 à 17:21:14

            ok merci pour les explications j'ai pu faire mon script.

            Il permet d'écrire le nom du fichier, et de créer une nouvelle ligne avec le nom du pc, de l'utilisateur, numero de serie de l'ecran 1 2 3, le tout sur une ligne. J'ai rajouter quelques lignes pour voir comment on manipule les cellules dans excel avec powershell.

            #variables---------------------------------------------------
            $ligne=1
            $colonne=3
            $i=0 
            
            
            #fonctions----------------------------------------------------
            function creationLigne($ligne)
            {
            
                $workbook.Cells.Item($ligne,1).value = $env:computername
                $workbook.Cells.Item($ligne,2).value = $env:UserName
            
                $numSerie=gwmi -computerName $env:computername WmiMonitorID -Namespace root\wmi | ForEach-Object {($_.SerialNumberID -ne 0 | foreach {[char]$_}) -join ''}
             
                for($i=0;$i -le $numSerie.Count;$i++){   
                    $workbook.Cells.Item($ligne,$colonne).value = $numSerie[$i]
                    $colonne++
                    
                }
                #ajustement automatique des colonnes en fonction des données 
                $workbook.Columns.AutoFit()
            }
              
              
              
            #creation du fichier excel------------------------------------
            $excel = new-object -comobject Excel.Application
            $excel.visible = $true
            $excel.DisplayAlerts = $False
              
            $workbook = $excel.Workbooks.Add()
            $workbook = $workbook.Worksheets.Item(1)
            $workbook.name= "Inventaire"
            
            #-------------------------------------------------------------
              
              
            #création de l'entête du tableau-------------------------------
            
            #fusion des colonnes pour la premiere ligne du tableau
            $MergeCells = $workbook.Range("A1:E1")
            $MergeCells.Select() 
            $MergeCells.MergeCells = $true
            
            #taille du texte, gras, couleurs
            $workbook.Range("A1:E1").font.size = 18
            $workbook.Range("A1:E1").font.bold = $true
            $workbook.Range("A1:E1").font.ColorIndex = 1
            $workbook.Range("A1:E1").interior.colorindex = 4
            
            #alignement
            $workbook.Range("A1:E1").HorizontalAlignment = -4108
            $workbook.Range("A1:E1").VerticalAlignment = -4108
            
            
            #encadrement
            $workbook.Range("A1:E1").Borders.LineStyle = 1
            
            
            $nomSecteur = Read-Host "Nom du secteur : "
            $workbook.Cells.Item(1,1) = $nomSecteur
            $workbook.Cells.Item(2,1).value = "Nom du PC"
            $workbook.Cells.Item(2,2).value = "Nom de l'utilisateur"
            $workbook.Cells.Item(2,3).value = "Num serie ecran 1"
            $workbook.Cells.Item(2,4).value = "Num serie ecran 2"
            $workbook.Cells.Item(2,5).value = "Num serie ecran 3"
            
              
            #recherche de la derniere ligne du tableau (la premiere vide)
            Do{
                if($workbook.Cells.Item($ligne,1).text -ne "")
                {
                    $ligne++ 
                }
            }Until($workbook.Cells.Item($ligne,1).text -eq "")
            
            
            
            #demande de recommancer pour relancer la fonction  
            Do{
                creationLigne "$ligne"
                $ligne++
                $recommencer= Read-Host "recommencer (n/y) : "
            }Until($recommencer -eq "n")
            
            
              
            
            #sauver un fichier excel
            $workbook.SaveAs("C:\$nomSecteur.xlsx")
            $excel.Workbooks.Close()
            $excel.Quit()
            
            



            • Partager sur Facebook
            • Partager sur Twitter

            [POWERSHELL]capture des numeros de serie d'ecran

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown