Question
création d'un boucle pour un script
- Maxime PENLOUP
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 5
- Remerciements reçus 0
il y a 5 ans 6 mois #27512
par Maxime PENLOUP
création d'un boucle pour un script a été créé 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...
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!
Merci d'avance pour vos retours.<br><br>Message édité par: Arnaud, à: 6/09/18 15:15
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...
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!
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.
- Jeekay
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 1
- Remerciements reçus 0
il y a 5 ans 6 mois #27513
par Jeekay
Réponse de Jeekay sur le sujet Re:création d'un boucle pour un script
Bonjour,
je pense que pour la lecture de toutes les lignes de ton excel, tu veux utiliser une boucle \"ForEach\".
[code:1]
$myValue = $finalWorkSheet.Cells.Item(2513,2).Text
foreach($value in $myValue){
if(($value -like $null) -or ($value -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:UsersmpenloupDesktoplistePCEnAttente.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:UsersmpenloupDesktoplistePCdisable.txt
}
}
[/code:1]
Pour ta question de log, actuellement, ton fichier est bien écrasé à chaque fois, il suffit d'ajouter un \"-Append\" à 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
je pense que pour la lecture de toutes les lignes de ton excel, tu veux utiliser une boucle \"ForEach\".
[code:1]
$myValue = $finalWorkSheet.Cells.Item(2513,2).Text
foreach($value in $myValue){
if(($value -like $null) -or ($value -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:UsersmpenloupDesktoplistePCEnAttente.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:UsersmpenloupDesktoplistePCdisable.txt
}
}
[/code:1]
Pour ta question de log, actuellement, ton fichier est bien écrasé à chaque fois, il suffit d'ajouter un \"-Append\" à 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.
- Maxime PENLOUP
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 5
- Remerciements reçus 0
il y a 5 ans 6 mois #27515
par Maxime PENLOUP
Réponse de Maxime PENLOUP sur le sujet Re:création d'un boucle pour un script
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
par contre pour l'histoire du forEach, je suis en plein milieu du pacifique et je surnage
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
- Hors Ligne
- Modérateur
il y a 5 ans 6 mois #27517
par Arnaud Petitjean
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 ?
Réponse de Arnaud Petitjean sur le sujet Re:création d'un boucle pour un script
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 :
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
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.
- Maxime PENLOUP
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 5
- Remerciements reçus 0
il y a 5 ans 6 mois #27523
par Maxime PENLOUP
Réponse de Maxime PENLOUP sur le sujet Re:création d'un boucle pour un script
Merci pour ton retour.
je vais voir ce que je peux faire à partir d'un fichier .txt
Bonne journée
je vais voir ce que je peux faire à partir d'un fichier .txt
Bonne journée
Connexion ou Créer un compte pour participer à la conversation.
- Maxime PENLOUP
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 5
- Remerciements reçus 0
il y a 5 ans 5 mois #27645
par Maxime PENLOUP
Réponse de Maxime PENLOUP sur le sujet Re:création d'un boucle pour un script
juste pour apporter une réponse à ce poste.
[code:1]workbook = $excel.Workbooks.open(\"C:\Users\XX\Desktop\listePC\listeAdesactiver_28092018.xlsx\"«»)
$Worksheet = $Workbook.WorkSheets.item(\"Feuil1\"«»)
$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 = \"*$NumPC*\"
$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 \"false\"«»){
write-host \"l'ordinateur $PcAD est déjà désactivé\" -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 \"false\"«»){
write-host \"l'ordinateur $PcAD2 est déjà désactivé\" -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
[code:1]workbook = $excel.Workbooks.open(\"C:\Users\XX\Desktop\listePC\listeAdesactiver_28092018.xlsx\"«»)
$Worksheet = $Workbook.WorkSheets.item(\"Feuil1\"«»)
$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 = \"*$NumPC*\"
$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 \"false\"«»){
write-host \"l'ordinateur $PcAD est déjà désactivé\" -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 \"false\"«»){
write-host \"l'ordinateur $PcAD2 est déjà désactivé\" -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
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- création d'un boucle pour un script