Question création d'un boucle pour un script

Plus d'informations
il y a 5 ans 6 mois #27512 par Maxime PENLOUP
Bonjour à tous,

je suis tout nouveau dans le monde Powershell.

Dans le cadre de mon travail, je dois créer un script qui devra lire des lignes excel et à partir de ces lignes discerner si il faut qu'il y est une désactivation du PC dans l'ad ou non.

j'ai alors écrit (je pense un peu maladroitement le script suivant :

[code:1]Import-Module activeDirectory


#appeler Excel en créant un nouvel
$excel = new-object -comobject Excel.Application
$excel.visible = $false
$excel.DisplayAlerts = $False

#Pour accéder à un classeur il suffit d'utiliser cette commande (pour un fichier existant)
$fichierExcel = $excel.WorkBooks.Open(\"C:\Users\mplp\Desktop\listeOrdinateurs.xlsx\"«»)

#S'il s'agit d'un nouveau fichier :
#$finalWorkBook = $objExcel.Workbooks.Add()

#Ensuite il est possible d'accéder à chaque onglet en précisant l'index dans la commande ci-dessous
$finalWorkSheet = $fichierExcel.Worksheets.Item(1)

#accéder aux cellules de l'onglet
$myValue = $finalWorkSheet.Cells.Item(2513,2).Text

if(($myValue -like $null) -or ($myValue -like \"Unsuccessful\"«»)){
Write-Host \"pas de valeur dans la cellule\"
#recherche de la cellule avec le nom du PC
$NumPC = $finalWorkSheet.Cells.Item(2513,1).Text
$NumeroPC = \"*$NumPC*\"
$PcAD = Get-ADComputer -Filter {Name -like $NumeroPC} | Select-Object name
$PcAD | Out-File C:\Users\mpenloup\Desktop\listePCEnAttente.txt

}else{

$NumeroPC = \"*$NumPC*\"
$PcAD = Get-ADComputer -Filter {Name -like $NumeroPC} | Select-Object name
foreach($ordiAD in $PcAD){
Set-ADComputer -identity $ordiAD.name -Enabled $false
}
$PcAD |Out-File C:\Users\mpenloup\Desktop\listePCdisable.txt

}

[/code:1]
Mon problème est le suivant. mon fichier excel contient 2545 lignes...:blink:
j'aimerai que mon script lise ligne par ligne le fichier et qu'ils prennent en considération les conditions pour chacune d'elle.

enfin, j'aimerai sortir un log convenable avec les noms des PC. j'ai l'impression qu'avec out-file, le log est écrasé à chaque fois... je me suis demandé si export-CSV ne serait pas ma solution mais le résultat est pire...

PLEASE HELP! :lol: :lol: :lol: :lol: :lol:

Merci d'avance pour vos retours.<br><br>Message édité par: Arnaud, à: 6/09/18 15:15

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

Plus d'informations
il y a 5 ans 6 mois #27513 par Jeekay
Bonjour,
je pense que pour la lecture de toutes les lignes de ton excel, tu veux utiliser une boucle \&quot;ForEach\&quot;.

[code:1]

$myValue = $finalWorkSheet.Cells.Item(2513,2).Text

foreach($value in $myValue){

if(($value -like $null) -or ($value -like \&quot;Unsuccessful\&quot;)){
Write-Host \&quot;pas de valeur dans la cellule\&quot;
#recherche de la cellule avec le nom du PC
$NumPC = $finalWorkSheet.Cells.Item(2513,1).Text
$NumeroPC = \&quot;*$NumPC*\&quot;
$PcAD = Get-ADComputer -Filter {Name -like $NumeroPC} | Select-Object name
$PcAD | Out-File C:UsersmpenloupDesktoplistePCEnAttente.txt

}else{

$NumeroPC = \&quot;*$NumPC*\&quot;
$PcAD = Get-ADComputer -Filter {Name -like $NumeroPC} | Select-Object name
foreach($ordiAD in $PcAD){
Set-ADComputer -identity $ordiAD.name -Enabled $false
}
$PcAD |Out-File C:UsersmpenloupDesktoplistePCdisable.txt

}

}
[/code:1]

Pour ta question de log, actuellement, ton fichier est bien écrasé à chaque fois, il suffit d'ajouter un \&quot;-Append\&quot; à la fin ton Out-File pour que le resultat s'ajoute à ton fichier log.

[code:1]

$PcAD | Out-File C:UsersmpenloupDesktoplistePCEnAttente.txt -Append

[/code:1]

En espérant t'avoir apporté un peu d'aide !

Bonne fin de journée

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

Plus d'informations
il y a 5 ans 6 mois #27515 par Maxime PENLOUP
merci pour le Out-file. ça fonctionne bien.

par contre pour l'histoire du forEach, je suis en plein milieu du pacifique et je surnage :whistle: :whistle: :whistle: :whistle:

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

Plus d'informations
il y a 5 ans 6 mois #27517 par Arnaud Petitjean
Bonjour,

Je pense que la bonne démarche pour s'éviter des ennuis (et aussi préparer l'avenir) serait plutôt de partir d'un fichier texte que d'une feuille Excel.

Donc je propose plusieurs options :
  • Format CSV
  • Format JSON

Et utiliser les commandes PowerShell adhoc pour lire le fichier source : Import-CSV ou ConvertFrom-JSON.

L'avantage du format CSV c'est que tu peux exporter facilement dans ce format à partir d'Excel.

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

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

Plus d'informations
il y a 5 ans 6 mois #27523 par Maxime PENLOUP
Merci pour ton retour.

je vais voir ce que je peux faire à partir d'un fichier .txt

Bonne journée :laugh:

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

Plus d'informations
il y a 5 ans 5 mois #27645 par Maxime PENLOUP
juste pour apporter une réponse à ce poste.

[code:1]workbook = $excel.Workbooks.open(\&quot;C:\Users\XX\Desktop\listePC\listeAdesactiver_28092018.xlsx\&quot;«»)
$Worksheet = $Workbook.WorkSheets.item(\&quot;Feuil1\&quot;«»)
$Worksheet.activate()

# Targeted cells - column D in Excel is the fourth
$col = 1
$col2 = 2
#$lines = @(1..2545)
$lines = @(1..3)
# Display cells' content


foreach ($line in $lines)
{

$NumPC = $worksheet.Cells.Item($line,$col).Value()
$NumeroPC = \&quot;*$NumPC*\&quot;
$PcAD = Get-ADComputer -Filter {Name -like $NumeroPC} -Server X
$PcAD2 = Get-ADComputer -Filter {Name -like $NumeroPC} -Server Y

foreach($ordiAD in $PcAD){
if($PcAD.Enabled -match \&quot;false\&quot;«»){
write-host \&quot;l'ordinateur $PcAD est déjà désactivé\&quot; -ForegroundColor Yellow
$PcAD.Name | out-file C:\Users\XX\Desktop\listePCdejaDesactiveX.txt -Append
}else{
Set-ADComputer -identity $ordiAD.name -Enabled $false -Server X
write-host $PcAD -ForegroundColor Green
$PcAD.Name | out-file C:\Users\XX\Desktop\listePCdisableX.txt -Append
}#end else
}#end foreach
foreach($ordiAD in $PcAD2){
if($ordiAD.Enabled -match \&quot;false\&quot;«»){
write-host \&quot;l'ordinateur $PcAD2 est déjà désactivé\&quot; -ForegroundColor Yellow
$PcAD2.Name | out-file C:\Users\XX\Desktop\listePCdejaDesactiveY.txt -Append
}else{
Set-ADComputer -identity $ordiAD.name -Enabled $false -Server Y
write-host $PcAD2 -ForegroundColor Cyan
$PcAD2.Name | out-file C:\Users\XX\Desktop\listePCdisableY.txt -Append
}#end else
}#end foreach

} # end foreach
# End of program, we close Excel
$workbook.Close()
$excel.Quit()
[/code:1]<br><br>Message édité par: MaxPLP, à: 4/10/18 08:22

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

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