Hoe Powershell Foreach, While en andere lussen werken

Hoe Powershell Foreach, While en andere lussen werken

Een cruciale eerste stap bij het leren programmeren is het werken met loops. Gelukkig blijft PowerShell groeien met je vaardigheden.





Windows 10 versnellen voor gamen

U kunt de bestaande opdrachten die u dagelijks gebruikt in lussen plaatsen om tijd en moeite te besparen. Uw scripts doen het zware werk terwijl u het belangrijke werk doet om meer artikelen over MakeUseOf te lezen!





Powershell ForEach Loops: de deur naar geavanceerde gegevensverwerking

ForEach is de alias voor het ForEach-Object. (Een alias is slechts een snelkoppeling voor een opdracht in PowerShell.) Dit is een goed moment om te praten over de manier waarop PowerShell met gegevens omgaat.





Net als de meeste moderne programmeertalen is PowerShell objectgeoriënteerd. Alles in PowerShell is een object, wat betekent dat zelfs variabelen uitgebreide eigenschappen en functies hebben . Die eigenschap is de reden waarom u uw zoekopdrachten op een variabele kunt instellen en een reeks resultaten kunt krijgen.

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

In sommige talen zou het verwerken van deze array een proces met meerdere stappen zijn. Eerst de lengte krijgen en vervolgens elke stap optellen.



In PowerShell stapt u door de array en voert u de actie op elke array uit met ForEach. Dit bespaart je een aantal regels code, wat handig is als je een langer script hebt. Het volgende is bijvoorbeeld een klein script dat een aantal Powershell ForEach-lussen zou gebruiken. Het creëert een ZIP-archief van al uw bestanden die u in 30 dagen niet hebt geopend.

Een bestandsarchiefsysteem bouwen met ForEach Loops

Laten we de trappen afbreken. Je gebruikt Get-ChildItem om alle bestanden in de map Documenten te krijgen. De omgevingsvariabele $env:GEBRUIKERSPROFIEL voert het script uit met het huidige profiel. Deze variabele is draagbaarder dan een hardgecodeerd pad. De resultaten van die zoekopdracht worden toegewezen aan de variabele $ Mijn Documenten . Vervolgens maken we onze ForEach-lus door deze door elke lus te laten lopen $Doc in $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
}

Binnen de lus controleren we of elk bestand is Laatste Toegangstijd eigendom is ouder dan 30 dagen. We krijgen dit met de Krijg datum cmdlet, en met behulp van de Dagen toevoegen functie met min dertig. Als dat zo is, voegen we het bestand toe aan de $myOldDocs reeks. Nadat het sorteren van bestanden is voltooid, nemen we onze voltooide array en maken we een zipbestand. Dit proces is iets gecompliceerder omdat het een beetje .NET aanroept. Maak je geen zorgen als je het niet helemaal begrijpt - je kunt de code stelen van dit TechNet-helpdocument .

Om uit te leggen wat hier gebeurt: we zullen al onze oude bestanden verplaatsen naar een nieuwe map met de naam voor de datum van vandaag die ouder is dan 30 dagen. Zodra die map is opgebouwd, moeten we het ZIP-archief met dezelfde naam maken. We zullen testen of het archief is gelukt en het .ZIP-bestand aanwezig is, en verwijderen vervolgens de nieuwe map. Stel dit in als een geplande taak die eenmaal per maand moet worden uitgevoerd. U bespaart uzelf wat ruimte en houdt uw map Documenten schoon.





While en Do While: lussen op voorwaarde

Als u alleen een lus wilt uitvoeren als aan een bepaalde voorwaarde is voldaan, gebruikt u een While-lus. Als u een variabele gebruikt om het optellen bij te houden, stelt u die eerst in.

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

Het probleem is dat als je geen teller gebruikt, je misschien wilt dat je code minstens één keer wordt uitgevoerd, zelfs als de test waar is. Dit is het geval met het onderstaande voorbeeldscript. Dus in die gevallen wil je een Do-While loop gebruiken. De syntaxis is iets anders.

do{
Your Steps
}while(Conditional Statement)

Het gebruik hiervan is voor een beginnende programmeur niet zo vanzelfsprekend. Als u typische dagelijkse scripts uitvoert, komt u ze misschien niet zo vaak tegen. Waar ze vooral van pas komen, is het maken van een geïmproviseerde timer om het succes van een proces te testen.

hoe je op iemand diep op het web kunt zoeken

We gaan een snel script maken om een ​​externe machine opnieuw op te starten en een waarschuwing te geven als deze niet binnen 15 minuten terugkomt. In dit scenario wordt ervan uitgegaan dat het een thuisserver of een andere machine is die niet vaak opnieuw opstart. Voel je vrij om de tijd aan te passen als je computer doorgaans sneller opstart.

Opnieuw opstarten en controleren: een Do-While Loop gebruiken

Dit script is iets eenvoudiger. Eerst gebruik je de Herstart computer opdracht om de externe machine opnieuw op te starten. (We hebben hier een dummy IP gebruikt voor de reboot-opdrachten, zorg ervoor dat u dit overschrijft met de DNS/IP van uw computer). Maak vervolgens de tellervariabele, l en zet het op 0. Vervolgens heb je je Do-lus met Start-Sleep die het script 300 seconden (vijf minuten) stopt. Een tweede commando voegt er een toe aan de teller.

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'
}

Dan hebben we onze While-criteria. We gebruiken een Of-test om ervoor te zorgen dat een storing een waarschuwing genereert. Het alternatief is dat het script eindeloos in een lus blijft wachten op de externe machine. Om de machine te controleren, gebruiken we de Test verbinding cmdlet. Voor de eenvoud is dit Ping voor PowerShell. We voegen de parameter toe: -Stil waardoor het gedwongen wordt True of False te retourneren in plaats van de resultaten van de pakketten. Het tweede deel van het Or-statement controleert of de teller hoger is dan drie.

Zodra de lus is voltooid, willen we de uitvoer maken. Dat betekent dat we onze balie moeten controleren. Dit is een korte if/else verklaring. Als het groter is dan drie, voert het script uit dat de externe computer niet reageert. Als dit niet het geval is, geeft het aan dat het opnieuw opstarten is gelukt.

Andere lussen

Er zijn twee andere soorten lussen beschikbaar in PowerShell. Ze zijn enigszins verwant aan de vorige twee lussen, ze worden alleen niet zo vaak gebruikt. Een For-lus werkt op dezelfde manier als het While-voorbeeld. U stelt al uw criteria in de evaluatie in en stelt vervolgens uw cmdlets in.

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

Doe tot-lussen zijn als Do While-lussen, u wijzigt gewoon de While-instructie in Tot. In het voorbeeldscript zou het hetzelfde zijn voor zover het gedrag betreft. Het is een stijlkeuze, maar de Do While is veelzijdiger in andere situaties. Dus als je er maar één onthoudt, is Do While nuttiger.

PowerShell heeft ook hulp voor elk van deze lussen. U kunt de hulp krijgen door toe te voegen wat betreft voor de lusnaam in Get-Help. U kunt dan voor elk type voorbeelden en andere tips bekijken. Deze zouden handig moeten zijn als je vastloopt.

Blijven groeien met jou

Op dit moment heb je de meeste vaardigheden om robuuste scripts te bouwen. Of u nu uw home-rig automatiseert of tijd bespaart op het werk, loops helpen uw scripts meer te doen. Door deze lussen te combineren met foutafhandeling, gaat uw scripting verder dan de basis. Dit opent de deur naar meer geavanceerde talen.

Wat is een slim PowerShell-script dat je hebt gemaakt met loops? Deel het met ons in de reacties.

Deel Deel Tweeten E-mail Verwijder deze Windows-bestanden en -mappen om schijfruimte vrij te maken

Wilt u schijfruimte op uw Windows-computer vrijmaken? Hier zijn de Windows-bestanden en -mappen die veilig kunnen worden verwijderd om schijfruimte vrij te maken.

Lees volgende
Gerelateerde onderwerpen
  • Programmeren
  • PowerShell
  • Scripting
Over de auteur Michael McConnell(44 artikelen gepubliceerd)

Michael gebruikte geen Mac toen ze gedoemd waren, maar hij kan coderen in Applescript. Hij heeft diploma's in computerwetenschappen en Engels; hij schrijft al een tijdje over Mac, iOS en videogames; en hij is al meer dan tien jaar een IT-aap overdag, gespecialiseerd in scripting en virtualisatie.

mail doorsturen van outlook naar gmail
Meer van Michael McConnell

Abonneer op onze nieuwsbrief

Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!

Klik hier om je te abonneren