Comment fonctionnent les boucles Powershell Foreach, While et autres

Comment fonctionnent les boucles Powershell Foreach, While et autres

Une première étape cruciale dans l'apprentissage de la programmation est de travailler avec des boucles. Heureusement, PowerShell continue de grandir avec vos compétences.





pourquoi mon téléphone ne se connecte-t-il pas à mon ordinateur

Vous pouvez encadrer les commandes existantes que vous utilisez tous les jours dans des boucles pour gagner du temps et des efforts. Vos scripts font le gros du travail pendant que vous faites le travail important de lire plus d'articles sur MakeUseOf !





Boucles Powershell ForEach : la porte vers une gestion avancée des données

ForEach est l'alias de l'objet ForEach. (Un alias est simplement un raccourci pour une commande dans PowerShell.) C'est le bon moment pour parler de la façon dont PowerShell gère les données.





Comme la plupart des langages de programmation modernes, PowerShell est orienté objet. Tout dans PowerShell est un objet, ce qui signifie que même les variables ont des propriétés et des fonctions étendues . Cette propriété est la raison pour laquelle vous pouvez définir vos recherches sur une variable et obtenir un tableau des résultats.

$yourVar = Get-ChildItem *
foreach ($file in $yourVar){
Your Steps
}

Dans certaines langues, le traitement de ce tableau serait un processus en plusieurs étapes. Tout d'abord, obtenir la longueur, puis compter chaque étape.



Dans PowerShell, vous parcourez le tableau et effectuez l'action sur chacun à l'aide de ForEach. Cela vous permet d'économiser plusieurs lignes de code, ce qui est utile si vous avez un script plus long. Par exemple, ce qui suit est un petit script qui utiliserait quelques boucles Powershell ForEach. Il crée une archive ZIP de tous vos fichiers que vous n'avez pas ouverts depuis 30 jours.

Création d'un système d'archivage de fichiers à l'aide de boucles ForEach

Brisons les marches. Tu utilises Get-ChildItem pour obtenir tous les fichiers du dossier Documents. La variable d'environnement $env:USERPROFILE exécute le script en utilisant le profil actuel. Cette variable est plus portable qu'un chemin codé en dur. Les résultats de cette recherche sont affectés à la variable $ MesDocuments . Nous créons ensuite notre boucle ForEach en la faisant parcourir chaque $Doc dans $MyDocs .





$oldDocs = @()
$MyDocs = Get-ChildItem -Path '$($env:USERPROFILE)Documents' -Recurse
foreach ($doc in $MyDocs){
if($doc.LastAccessTime -lt $(Get-Date).addDays(-30)){
$oldDocs += $doc
}
}
$ArchiveFolder = New-Item -Path '$($env:USERPROFILE)Documents$((Get-Date -Format MMddyy).toString())' -ItemType Directory
foreach ($doc in $oldDocs){
Move-Item -Path $doc.FullName -Destination '$($ArchiveFolder.FullName)$($doc.Name)' -Confirm $false
}
$source = $ArchiveFolder.FullName
$destination = '$($env:USERPROFILE)Documents$($ArchiveFolder.Name).zip'
Add-Type -AssemblyName 'system.io.compression.filesystem'
[io.compression.zipfile]::CreateFromDirectory($source, $destination)
if(test-path $destination){
Remove-Item -Path $ArchiveFolder -Recurse -Confirm $false
}

Dans la boucle, nous vérifions si chaque fichier est LastAccessTime la propriété a plus de 30 jours. Nous obtenons ceci avec le Avoir un rendez-vous applet de commande et en utilisant le Ajouter des jours fonction avec moins trente. Si c'est le cas, nous ajoutons le fichier au $myOldDocs déployer. Une fois le tri des fichiers terminé, nous prenons ensuite notre tableau terminé et créons un fichier zip. Ce processus est un peu plus compliqué car il implique d'invoquer un peu de .NET. Ne vous inquiétez pas si vous ne comprenez pas tout à fait - vous pouvez voler le code de ce document d'aide TechNet .

Pour décomposer ce qui se passe ici : Nous déplacerons tous nos anciens fichiers vers un nouveau répertoire nommé pour la date d'aujourd'hui depuis plus de 30 jours. Une fois ce dossier créé, nous devons créer l'archive ZIP du même nom. Nous allons tester pour nous assurer que l'archive a réussi et que le fichier .ZIP est là, puis supprimer le nouveau dossier. Définissez ceci comme une tâche planifiée à exécuter une fois par mois. Vous économiserez un peu d'espace et garderez votre dossier Documents propre.





While et Do While : boucles sur condition

Si vous souhaitez exécuter une boucle uniquement lorsqu'une condition particulière est remplie, vous utilisez une boucle While. Si vous utilisez une variable pour suivre le décompte, définissez-la d'abord.

i=0
while(i<10){
Your Steps
i+=1
}

Le problème est que si vous n'utilisez pas de compteur, vous voudrez peut-être que votre code s'exécute au moins une fois même si le test est vrai. C'est le cas de l'exemple de script ci-dessous. Donc, dans ces cas, vous souhaitez utiliser une boucle Do-While . La syntaxe est légèrement différente.

do{
Your Steps
}while(Conditional Statement)

Leur utilisation n'est pas aussi évidente pour un programmeur novice. En faisant des scripts quotidiens typiques, vous ne les rencontrerez peut-être pas si souvent. Là où ils sont particulièrement utiles, c'est de créer une minuterie de fortune pour tester le succès d'un processus.

comment regarder le câble sur roku

Nous allons créer un script rapide pour redémarrer une machine distante et alerter si elle ne revient pas dans les 15 minutes. Ce scénario suppose qu'il s'agit d'un serveur domestique ou d'une autre machine qui ne redémarre pas très souvent. N'hésitez pas à ajuster l'heure si votre ordinateur démarre généralement plus rapidement.

Redémarrer et vérifier : utiliser une boucle Do-While

Ce script est un peu plus simple. Tout d'abord, vous utilisez le Redémarrer l'ordinateur commande pour redémarrer la machine distante. (Nous avons utilisé une adresse IP factice ici pour les commandes de redémarrage, assurez-vous de l'écraser avec le DNS/IP de votre ordinateur). Créez ensuite la variable compteur, je et définissez-le sur 0. Ensuite, vous avez votre boucle Do avec Start-Sleep arrêtant le script pendant 300 secondes (cinq minutes). Une deuxième commande en ajoute un au compteur.

Restart-Computer -ComputerName 127.0.0.1
i=0
do{
Start-Sleep -Seconds 300
$i += 1
}while((!(Test-Connection 127.0.0.1 -Quiet)) -or $i -gt 3)
if($i -gt 3){
Write-Ouput 'Remote Machine not responding, please check.'
}
else{
Write-Output 'Reboot Succeeded'
}

Ensuite, nous avons nos critères While. Nous utilisons un test Or pour nous assurer qu'un échec génère une alerte. L'alternative est le script en boucle en attendant sans cesse la machine distante. Pour vérifier la machine, nous utilisons le Test-Connexion applet de commande. Pour plus de simplicité, il s'agit de Ping pour PowerShell. On ajoute le paramètre -Calmer ce qui l'oblige à renvoyer True ou False plutôt que les résultats des paquets. La deuxième partie de l'instruction Or vérifie si le compteur est supérieur à trois.

Une fois la boucle terminée, nous voulons créer la sortie. Cela signifie que nous devons vérifier notre compteur. Ceci est une instruction if/else rapide. S'il est supérieur à trois, le script indique que la machine distante ne répond pas. Si ce n'est pas le cas, il indique que le redémarrage a réussi.

Autres boucles

Il existe deux autres types de boucles disponibles dans PowerShell. Ils sont quelque peu liés aux deux boucles précédentes, ils ne sont tout simplement pas aussi couramment utilisés. Une boucle For fonctionne de manière similaire à l'exemple While. Vous définissez tous vos critères dans l'évaluation, puis définissez vos applets de commande.

for($i = 0;$i -lt 10;$i++){
Your Steps
}

Les boucles Do Until sont comme les boucles Do While, vous changez simplement l'instruction While en Until. Dans l'exemple de script, ce serait la même chose en ce qui concerne le comportement. C'est un choix de style, mais le Do While est plus polyvalent dans d'autres situations. Donc, si vous ne vous en souvenez que d'un, Do While est plus utile.

PowerShell propose également de l'aide pour chacune de ces boucles. Vous pouvez obtenir de l'aide en ajoutant À propos avant le nom de la boucle dans Get-Help. Vous pouvez ensuite voir des exemples et d'autres conseils pour chaque type. Ceux-ci devraient être utiles si vous êtes bloqué.

Continuer à grandir avec vous

À ce stade, vous disposez de la plupart des compétences pour commencer à créer des scripts robustes. Qu'il s'agisse d'automatiser votre installation domestique ou de gagner du temps au travail, les boucles aident vos scripts à en faire plus. La combinaison de ces boucles avec la gestion des erreurs déplace votre script au-delà des bases. Cela ouvre la porte à des langages plus avancés.

Qu'est-ce qu'un script PowerShell intelligent que vous avez créé à l'aide de boucles ? Partagez-le avec nous dans les commentaires.

Partager Partager Tweeter E-mail Supprimez ces fichiers et dossiers Windows pour libérer de l'espace disque

Besoin de libérer de l'espace disque sur votre ordinateur Windows ? Voici les fichiers et dossiers Windows qui peuvent être supprimés en toute sécurité pour libérer de l'espace disque.

Lire la suite
Rubriques connexes
  • La programmation
  • PowerShell
  • Script
A propos de l'auteur Michael McConnell(44 articles publiés)

Michael n'utilisait pas de Mac quand ils étaient condamnés, mais il peut coder en Applescript. Il est diplômé en informatique et en anglais ; il écrit sur Mac, iOS et les jeux vidéo depuis un certain temps maintenant ; et il est un singe informatique diurne depuis plus d'une décennie, spécialisé dans les scripts et la virtualisation.

comment savoir si quelqu'un utilise incognito
Plus de Michael McConnell

Abonnez-vous à notre newsletter

Rejoignez notre newsletter pour des conseils techniques, des critiques, des ebooks gratuits et des offres exclusives !

Cliquez ici pour vous abonner