Partage
  • Partager sur Facebook
  • Partager sur Twitter

Powershell erreur boucle Foreach

Sujet résolu
    14 avril 2021 à 15:59:36

    Bonjour,

    petit problème sur un de mes scripts et je n'arrive pas a trouver de solution, tout aide sera apprécier.

    J'ai un script qui va chercher des données de l'AD et d'une base de données.

    Pour toutes les valeurs contenue dans l'AD qui n'appartienne pas a deux OU spécifique je souhaite faire la comparaison avec les valeurs trouver dans ma base de données et s'il y a une équivalence sur le nom de la machine alors je souhaite ajouter le nom du client associé a mon fichier excell.

    Toutes la parties récupération de données de l'AD et envoie dans le fichier excell marche bien (même si ce n'est peut être pas optimal) En revanche lorsque que je fais la deuxième boucle foreach (sccm) j'ai un problème, je suis capable de trouver la première valeur mais ensuite le comparatif ce fait toujours avec la première valeur dans la variable $SCCM, ca ne passe pas à la valeur suivante.

    $properties =
    @(
    'cn',
    'DistinguishedName',
    'Description',
    'OperatingSystem',
    'OperatingSystemVersion',
    'OperatingSystemServicePack'
    
    )
    #Récupérer les données De sccm
    
    Set-Location "SQLSERVER:\SQL\Server\DEFAULT\Databases\DAta"
    $SCCMentry = Invoke-Sqlcmd -Query "SELECT [Active0],[User_Name0],[Name0],[User_Account_Control0],[Distinguished_Name0] FROM [CM_PS1].[dbo].[v_R_System] Where User_Account_Control0!=4098 AND (Distinguished_Name0 NOT LIKE 'B') AND (Distinguished_Name0 NOT LIKE 'C')  AND (Operating_System_Name_and0 NOT LIKE '%Server%') AND (User_Name0 NOT LIKE '') AND (User_Name0 NOT LIKE 'utilisateur');" 
    cd C:/
    
    # Lancement d'une instance de MS Excel
    $excel = New-Object -ComObject "Excel.Application"            
    #$excel.Visible = $True
    $excel.DisplayAlerts = $False
    
    # Création d'une feuille Excel + activation de la feuille en cours   
    $workbook = $excel.Workbooks.Add()
    $sheet = $workbook.Worksheets.Item(1)
    $sheet.Activate() | Out-Null
    
    # On se positionne en A1 sur Excel (ligne=1/colonne=1)
    # La première ligne correspondra aux titres des colonnes
    $row = 1
    $Column = 1
    
    # Saisie des données dans Excel
    $sheet.Cells.Item($row,$column)= 'CI CATEGORY'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++
    # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= 'CI FOLDER'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++
     # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= 'CI STATE'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++ 
    # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= 'ACTIVE'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++ 
    # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= 'MANUAL CI NUMBER'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++ 
    # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= 'ENGLISH NAME'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++ 
    # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= 'FRENCH NAME'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++ 
    # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= 'ENGLISH DESCRIPTION'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++ 
    # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= 'FRENCH DESCRIPTION'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++ 
    # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= 'CLIENT'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++ # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= 'OWNER'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++ 
    # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= 'ENTERPRISE'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++
     # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= 'IMPACTED CIS'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++ 
    # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= '0'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++ 
    # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= '1'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++
     # On passe à la colonne suivante
    
    $sheet.Cells.Item($row,$column)= '2'
    $sheet.Cells.Item($row,$column).Font.Bold=$True
    $Column++ 
    # On passe à la colonne suivante
    
    # On passe à la seconde ligne et on revient à la colonne 1 (A2)
    $row = 2
    $Column = 1
    # Récupération des données AD pour les ordinateurs
    
    $entries = Get-ADComputer -properties $properties -Filter {operatingsystem -notlike "*Server*" -and operatingsystem -notlike "*red*" -and userAccountControl -ne 4098} 
    foreach ($entry in $entries){
    $NOMClient = $NULL
    $SCCMClient1 = $NULL
      echo $SCCMClient1 
     
    
    
    
        if($entries1 = $entry|Where-Object {($_.distinguishedname  -notlike "B" -and $_.distinguishedname  -notlike "C")}){
            echo "1 boucle if"
            echo "1 boucle foreach"
    
        :sccm foreach ($SCCM in $SCCMentry){
     echo $SCCM.Name0
     echo $entries1.cn
        if($SCCM.Name0 -eq $entries1.cn){
        $NOMClient = $SCCM.User_Name0
        $SCCMClient1 =  $NOMClient + "@domaine.com"
        Echo $SCCMClient1
        }else{
        $SCCMClient1 = $NULL
        }
        pause
        break sccm
    }
    
         
        #boucle pour remplir le excell
        echo "2 boucle if"
    
                        $sheet.Cells.Item($row,$column) = "Materiels"
                        $column++
    
                        $sheet.Cells.Item($row,$column) = "Ordinateurs"
                        $column++
    
                        $sheet.Cells.Item($row,$column) = "En Production"
                        $column++
    
                        $sheet.Cells.Item($row,$column) = 1
                        $column++
    
                        $sheet.Cells.Item($row,$column) = $entries1.cn
                        $column++
    
                        $sheet.Cells.Item($row,$column) = $entries1.cn
                        $column++
    
                        $sheet.Cells.Item($row,$column) = $entries1.cn
                        $column++
    
                        $sheet.Cells.Item($row,$column) = $entries1.Description
                        $column++
    
                        $sheet.Cells.Item($row,$column) = $entries1.Description
                        $column++
    
                        $sheet.Cells.Item($row,$column) = $NULL
                        $column++
             
                        $sheet.Cells.Item($row,$column) = $SCCMClient1
                        $column++
      
                        $sheet.Cells.Item($row,$column) = $NULL
                        $column++
    
                        $sheet.Cells.Item($row,$column) = $NULL
                        $column++
    
                        $sheet.Cells.Item($row,$column) = $entries1.OperatingSystem
                        $column++
            
    
                        $sheet.Cells.Item($row,$column) = $entries1.OperatingSystemVersion
                        $column++
    
                        $sheet.Cells.Item($row,$column) = $entries1.OperatingSystemServicePack
                        $column++
    
                        $row++
                        $column=1
                    echo "remise a null valeur client"
     
                        }
    if($entries2 =$entry|Where-Object {($_.distinguishedname  -like "B" -and $_.distinguishedname  -notlike "C")}){
        #boucle pour remplir le excell
       echo "3 boucle if"
             $sheet.Cells.Item($row,$column) = "Materiels"
             $column++
    
             $sheet.Cells.Item($row,$column) = "Laboratoire"
             $column++
    
             $sheet.Cells.Item($row,$column) = "En Production"
             $column++
    
             $sheet.Cells.Item($row,$column) = 1
             $column++
    
             $sheet.Cells.Item($row,$column) = $entries2.cn
             $column++
    
             $sheet.Cells.Item($row,$column) = $entries2.cn
             $column++
    
             $sheet.Cells.Item($row,$column) = $entries2.cn
             $column++
    
             $sheet.Cells.Item($row,$column) = $entries2.Description
             $column++
    
             $sheet.Cells.Item($row,$column) = $entries2.Description
             $column++
    
             $sheet.Cells.Item($row,$column) = $NULL
             $column++
    
             $sheet.Cells.Item($row,$column) = $NULL
             $column++
    
             $sheet.Cells.Item($row,$column) = $NULL
             $column++
    
             $sheet.Cells.Item($row,$column) = $NULL
             $column++
    
             $sheet.Cells.Item($row,$column) = $entries2.OperatingSystem
             $column++
            
    
             $sheet.Cells.Item($row,$column) = $entries2.OperatingSystemVersion
             $column++
    
             $sheet.Cells.Item($row,$column) = $entries2.OperatingSystemServicePack
             $column++
    
             $row++
             $column=1
       
        }elseif($entries3 =$entry|Where-Object {($_.distinguishedname  -like "C"}){
        #boucle pour remplir le excell
      echo "4 boucle if"
             $sheet.Cells.Item($row,$column) = "Materiels"
             $column++
    
             $sheet.Cells.Item($row,$column) = "Kiosk"
             $column++
    
             $sheet.Cells.Item($row,$column) = "En Production"
             $column++
    
             $sheet.Cells.Item($row,$column) = 1
             $column++
    
             $sheet.Cells.Item($row,$column) = $entries3.cn
             $column++
    
             $sheet.Cells.Item($row,$column) = $entries3.cn
             $column++
    
             $sheet.Cells.Item($row,$column) = $entries3.cn
             $column++
    
             $sheet.Cells.Item($row,$column) = $entries3.Description
             $column++
    
             $sheet.Cells.Item($row,$column) = $entries3.Description
             $column++
    
             $sheet.Cells.Item($row,$column) = $NULL
             $column++
    
             $sheet.Cells.Item($row,$column) = $NULL
             $column++
    
             $sheet.Cells.Item($row,$column) = $NULL
             $column++
    
             $sheet.Cells.Item($row,$column) = $NULL
             $column++
    
             $sheet.Cells.Item($row,$column) = $entries3.OperatingSystem
             $column++
            
    
             $sheet.Cells.Item($row,$column) = $entries3.OperatingSystemVersion
             $column++
    
             $sheet.Cells.Item($row,$column) = $entries3.OperatingSystemServicePack
             $column++
    
             $row++
             $column=1
        }
        
    }
    
    
    # Optionnel : vous pouvez vouloir sauvegarder le fichier que vous venez de générer
    $path="C:\Users\Ordinateurs"
    $workbook.SaveAs($path,62)
    $workbook.Close
    $excel.Quit()
    
    #################################################
    # END OF PROGRAM
    #################################################
    



    -
    Edité par jessicaChabert 14 avril 2021 à 16:28:58

    • Partager sur Facebook
    • Partager sur Twitter
      14 avril 2021 à 17:06:13

      tu es sûr que $SCCMentry te renvoie ce que tu penses avoir ?

      dans les exemples (7 et 8) de la doc, ils rajoutent à la commande invoke-sql 'As DataSet' pour récupérer les données, et les traiter comme un tableau derrière

      https://docs.microsoft.com/en-us/powershell/module/sqlserver/invoke-sqlcmd?view=sqlserver-ps#example-7--capture-data-into-a-dataset-object 

      • Partager sur Facebook
      • Partager sur Twitter
        19 avril 2021 à 17:34:16

        Bonjour, alors oui $SCCMentry me renvoyer bien les bonnes valeurs. le weekend m'a été bénéfique j'ai trouver une solution.

        j'ai enlever le foreach problématique et voici ce que cela donne. Peut être pas le plus élégant mais fonctionne bien.

        Merci d'avoir regardé. Et je vais regarder 'as dataset' je ne l'avait pas vue dans la doc.

        $properties =
        @(
        'cn',
        'DistinguishedName',
        'Description',
        'OperatingSystem',
        'OperatingSystemVersion',
        'OperatingSystemServicePack'
         
        )
        #Récupérer les données De sccm
         
        Set-Location "SQLSERVER:\SQL\Server\DEFAULT\Databases\DAta"
        $SCCMentry = Invoke-Sqlcmd -Query "SELECT [Active0],[User_Name0],[Name0],[User_Account_Control0],[Distinguished_Name0] FROM [CM_PS1].[dbo].[v_R_System] Where User_Account_Control0!=4098 AND (Distinguished_Name0 NOT LIKE 'B') AND (Distinguished_Name0 NOT LIKE 'C')  AND (Operating_System_Name_and0 NOT LIKE '%Server%') AND (User_Name0 NOT LIKE '') AND (User_Name0 NOT LIKE 'utilisateur');"
        cd C:/
         
        # Lancement d'une instance de MS Excel
        $excel = New-Object -ComObject "Excel.Application"           
        #$excel.Visible = $True
        $excel.DisplayAlerts = $False
         
        # Création d'une feuille Excel + activation de la feuille en cours  
        $workbook = $excel.Workbooks.Add()
        $sheet = $workbook.Worksheets.Item(1)
        $sheet.Activate() | Out-Null
         
        # On se positionne en A1 sur Excel (ligne=1/colonne=1)
        # La première ligne correspondra aux titres des colonnes
        $row = 1
        $Column = 1
         
        # Saisie des données dans Excel
        $sheet.Cells.Item($row,$column)= 'CI CATEGORY'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
        # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= 'CI FOLDER'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
         # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= 'CI STATE'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
        # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= 'ACTIVE'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
        # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= 'MANUAL CI NUMBER'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
        # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= 'ENGLISH NAME'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
        # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= 'FRENCH NAME'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
        # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= 'ENGLISH DESCRIPTION'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
        # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= 'FRENCH DESCRIPTION'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
        # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= 'CLIENT'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++ # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= 'OWNER'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
        # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= 'ENTERPRISE'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
         # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= 'IMPACTED CIS'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
        # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= '0'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
        # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= '1'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
         # On passe à la colonne suivante
         
        $sheet.Cells.Item($row,$column)= '2'
        $sheet.Cells.Item($row,$column).Font.Bold=$True
        $Column++
        # On passe à la colonne suivante
         
        # On passe à la seconde ligne et on revient à la colonne 1 (A2)
        $row = 2
        $Column = 1
        $b = ($SCCMentry.count)
        # Récupération des données AD pour les ordinateurs
         
        $entries = Get-ADComputer -properties $properties -Filter {operatingsystem -notlike "*Server*" -and operatingsystem -notlike "*red*" -and userAccountControl -ne 4098}
        foreach ($entry in $entries){
        $NOMClient = $NULL
        $SCCMClient1 = $NULL
          echo $SCCMClient1
          
            if($entries1 = $entry|Where-Object {($_.distinguishedname  -notlike "B" -and $_.distinguishedname  -notlike "C")}){
              
            #boucle pour remplir le excell
         
                            $sheet.Cells.Item($row,$column) = "Materiels"
                            $column++
         
                            $sheet.Cells.Item($row,$column) = "Ordinateurs"
                            $column++
         
                            $sheet.Cells.Item($row,$column) = "En Production"
                            $column++
         
                            $sheet.Cells.Item($row,$column) = 1
                            $column++
         
                            $sheet.Cells.Item($row,$column) = $entries1.cn
                            $column++
         
                            $sheet.Cells.Item($row,$column) = $entries1.cn
                            $column++
         
                            $sheet.Cells.Item($row,$column) = $entries1.cn
                            $column++
         
                            $sheet.Cells.Item($row,$column) = $entries1.Description
                            $column++
         
                            $sheet.Cells.Item($row,$column) = $entries1.Description
                            $column++
         
                            $sheet.Cells.Item($row,$column) = $NULL
                            $column++
                 
        For($SCCM=0; $SCCM -lt $b ;$SCCM++){ if($SCCMentry[$SCCM].Name0 -eq $entries1.cn){ $Client = $SCCMentry[$SCCM].User_Name0 $Client1 = $Client + "@domain.com" $sheet.Cells.Item($row,$column) = $Client1 } } $Column++ $sheet.Cells.Item($row,$column) = $NULL $column++ $sheet.Cells.Item($row,$column) = $NULL $column++ $sheet.Cells.Item($row,$column) = $entries1.OperatingSystem $column++ $sheet.Cells.Item($row,$column) = $entries1.OperatingSystemVersion $column++ $sheet.Cells.Item($row,$column) = $entries1.OperatingSystemServicePack $column++ $row++ $column=1 } if($entries2 =$entry|Where-Object {($_.distinguishedname -like "B" -and $_.distinguishedname -notlike "C")}){ #boucle pour remplir le excell echo "3 boucle if" $sheet.Cells.Item($row,$column) = "Materiels" $column++ $sheet.Cells.Item($row,$column) = "Laboratoire" $column++ $sheet.Cells.Item($row,$column) = "En Production" $column++ $sheet.Cells.Item($row,$column) = 1 $column++ $sheet.Cells.Item($row,$column) = $entries2.cn $column++ $sheet.Cells.Item($row,$column) = $entries2.cn $column++ $sheet.Cells.Item($row,$column) = $entries2.cn $column++ $sheet.Cells.Item($row,$column) = $entries2.Description $column++ $sheet.Cells.Item($row,$column) = $entries2.Description $column++ $sheet.Cells.Item($row,$column) = $NULL $column++ $sheet.Cells.Item($row,$column) = $NULL $column++ $sheet.Cells.Item($row,$column) = $NULL $column++ $sheet.Cells.Item($row,$column) = $NULL $column++ $sheet.Cells.Item($row,$column) = $entries2.OperatingSystem $column++ $sheet.Cells.Item($row,$column) = $entries2.OperatingSystemVersion $column++ $sheet.Cells.Item($row,$column) = $entries2.OperatingSystemServicePack $column++ $row++ $column=1 }elseif($entries3 =$entry|Where-Object {($_.distinguishedname -like "C"}){ #boucle pour remplir le excell echo "4 boucle if" $sheet.Cells.Item($row,$column) = "Materiels" $column++ $sheet.Cells.Item($row,$column) = "Kiosk" $column++ $sheet.Cells.Item($row,$column) = "En Production" $column++ $sheet.Cells.Item($row,$column) = 1 $column++ $sheet.Cells.Item($row,$column) = $entries3.cn $column++ $sheet.Cells.Item($row,$column) = $entries3.cn $column++ $sheet.Cells.Item($row,$column) = $entries3.cn $column++ $sheet.Cells.Item($row,$column) = $entries3.Description $column++ $sheet.Cells.Item($row,$column) = $entries3.Description $column++ $sheet.Cells.Item($row,$column) = $NULL $column++ $sheet.Cells.Item($row,$column) = $NULL $column++ $sheet.Cells.Item($row,$column) = $NULL $column++ $sheet.Cells.Item($row,$column) = $NULL $column++ $sheet.Cells.Item($row,$column) = $entries3.OperatingSystem $column++ $sheet.Cells.Item($row,$column) = $entries3.OperatingSystemVersion $column++ $sheet.Cells.Item($row,$column) = $entries3.OperatingSystemServicePack $column++ $row++ $column=1 } } # Optionnel : vous pouvez vouloir sauvegarder le fichier que vous venez de générer $path="C:\Users\Ordinateurs" $workbook.SaveAs($path,62) $workbook.Close $excel.Quit() ################################################# # END OF PROGRAM #################################################





        -
        Edité par jessicaChabert 19 avril 2021 à 17:37:34

        • Partager sur Facebook
        • Partager sur Twitter

        Powershell erreur boucle Foreach

        × 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