Hvordan Powershell Foreach, While og andre sløjfer fungerer

Hvordan Powershell Foreach, While og andre sløjfer fungerer

Et afgørende første trin i at lære programmering er at arbejde med loops. Heldigvis fortsætter PowerShell med at vokse med dine færdigheder.





usb -flashdrev vises ikke i windows 10

Du kan indramme de eksisterende kommandoer, du bruger hver dag i loops for at spare tid og kræfter. Dine scripts gør de tunge løft, mens du gør det vigtige arbejde med at læse flere artikler om MakeUseOf!





Powershell ForEach Loops: Døren til avanceret datahåndtering

ForEach er aliaset for ForEach-Object. (Et alias er blot en genvej til en kommando i PowerShell.) Dette er et godt tidspunkt at tale om den måde, hvorpå PowerShell håndterer data.





Som de fleste moderne programmeringssprog er PowerShell objektorienteret. Alt i PowerShell er et objekt, hvilket betyder, at selv variabler har udvidede egenskaber og funktioner . Denne egenskab er derfor, du kan indstille dine søgninger til en variabel og ende med en række resultater.

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

På nogle sprog ville behandling af denne matrix være en proces i flere trin. Først få længden og derefter tælle hvert trin op.



I PowerShell går du gennem arrayet og udfører handlingen på hver enkelt ved hjælp af ForEach. Dette sparer dig for flere linjer med kode, hvilket er nyttigt, hvis du har et længere script. For eksempel er det følgende et lille script, der ville bruge et par Powershell ForEach -sløjfer. Det opretter et ZIP -arkiv med alle dine filer, som du ikke har åbnet i 30 dage.

Opbygning af et filarkivsystem ved hjælp af ForEach Loops

Lad os bryde trinene ned. Du bruger Get-ChildItem for at få alle filerne i mappen Dokumenter. Miljøvariablen $ env: BRUGERPROFIL kører scriptet ved hjælp af den aktuelle profil. Denne variabel er mere bærbar end en hardcoded sti. Resultaterne af denne søgning tildeles variablen $ MyDocs . Vi opretter derefter vores ForEach -loop ved at få den til at gå igennem hver $ Doc i $ 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
}

Inde i løkken kontrollerer vi, om hver fil er LastAccessTime ejendommen er ældre end 30 dage. Vi får dette med Get-Date cmdlet, og ved hjælp af Tilføjedage funktion med negative tredive. Hvis det er tilfældet, tilføjer vi filen til $ myOldDocs array. Når filsorteringen er fuldført, tager vi vores færdige array og opretter en zip -fil. Denne proces er lidt mere kompliceret, da den indebærer at påberåbe lidt .NET. Bare rolig, hvis du ikke helt forstår det - du kan stjæle koden fra dette TechNet -hjælpedokument .

For at opdele, hvad der sker her: Vi flytter alle vores gamle filer til et nyt bibliotek, der er opkaldt efter dagens dato i ældre end 30 dage. Når denne mappe er bygget, skal vi oprette ZIP -arkivet med samme navn. Vi tester for at sikre, at arkivet lykkedes, og .ZIP -filen er der, og derefter sletter den nye mappe. Angiv dette som en planlagt opgave til at køre en gang om måneden. Du sparer dig selv for lidt plads og holder mappen Dokumenter ren.





While and Do While: Loops on Condition

Hvis du kun vil køre en loop, når en bestemt betingelse er opfyldt, bruger du en While -loop. Hvis du bruger en variabel til at spore optællingen, skal du først indstille det.

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

Problemet er, at hvis du ikke bruger en tæller, vil du måske have din kode til at køre mindst en gang, selvom testen er sand. Dette er tilfældet med eksemplet script nedenfor. Så i disse tilfælde vil du bruge en Do-While-sløjfe. Syntaksen er lidt anderledes.

do{
Your Steps
}while(Conditional Statement)

At bruge disse er ikke helt så indlysende for en nybegynder programmerer. Hvis du laver typisk dagligt scripting, støder du måske ikke så tit på dem. Hvor de især er nyttige, er at lave en provisorisk timer til at teste succesen af ​​en proces.

ms office download med produktnøgle

Vi skal bygge et hurtigt script til at genstarte en fjernmaskine og advare, hvis det ikke kommer tilbage inden for 15 minutter. Dette scenario forudsætter, at det er en hjemmeserver eller anden maskine, der ikke genstarter ret ofte. Du er velkommen til at justere tiden, hvis din computer typisk kommer hurtigere op.

Genstart og tjek: Brug af en Do-While Loop

Dette script er lidt enklere. Først bruger du Genstart-computer kommando for at genstarte fjernmaskinen. (Vi brugte en dummy IP her til genstartskommandoerne, sørg for at overskrive dette med din computers DNS/IP). Opret derefter tællervariablen, jeg og sæt den til 0. Dernæst har du din Do-loop med Start-Sleep, der stopper scriptet i 300 sekunder (fem minutter). En anden kommando tilføjer en til tælleren.

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

Så har vi vores While -kriterier. Vi bruger en Or -test for at sikre, at en fejl genererer en advarsel. Alternativet er, at scriptet loopes uendeligt og venter på fjernmaskinen. For at kontrollere maskinen bruger vi Testforbindelse cmdlet. For nemheds skyld er dette Ping for PowerShell. Vi tilføjer parameteren -Rolige hvilket tvinger den til at returnere Sandt eller Falsk frem for resultaterne af pakkerne. Den anden del af Or -sætningen kontrollerer, om tælleren er mere end tre.

Når sløjfen er færdig, vil vi oprette outputtet. Det betyder, at vi skal tjekke vores tæller. Dette er en hurtig if/else -erklæring. Hvis det er større end tre, udsender scriptet, at fjernmaskinen ikke reagerer. Hvis det ikke er det, udsender det, at genstart var vellykket.

Andre sløjfer

Der er to andre slags loops tilgængelige i PowerShell. De er noget relateret til de to foregående sløjfer, de er bare ikke så almindeligt anvendte. En For -loop fungerer på samme måde som While -eksemplet. Du angiver alle dine kriterier i evalueringen, og indstiller derefter dine cmdlets.

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

Gør indtil sløjfer er som Do While -sløjfer, du ændrer bare While -sætningen til Till. I eksemplet script ville det være det samme for så vidt angår adfærd. Det er et stilvalg, men Do While er mere alsidig i andre situationer. Så hvis du kun husker en, er Do While mere nyttig.

PowerShell har også hjælp til hver af disse sløjfer. Du kan få hjælp ved at tilføje om før loop-navnet i Get-Help. Du kan derefter se eksempler og andre tips til hver type. Disse burde være nyttige, hvis du sidder fast.

Fortsætter med at vokse med dig

På dette tidspunkt har du de fleste færdigheder til at begynde at bygge robuste scripts. Uanset om du automatiserer din hjemmeplatform eller sparer tid på arbejdet, hjælper loops dine scripts med at gøre mere. Kombination af disse sløjfer med fejlhåndtering flytter dit scripting ud over det grundlæggende. Dette åbner døren til mere avancerede sprog.

Hvad er et smart PowerShell -script, du har oprettet ved hjælp af loops? Del det med os i kommentarerne.

Del Del Tweet E -mail Slet disse Windows -filer og mapper for at frigøre diskplads

Har du brug for at rydde diskplads på din Windows -computer? Her er Windows -filer og mapper, der sikkert kan slettes for at frigøre diskplads.

Læs Næste
Relaterede emner
  • Programmering
  • PowerShell
  • Scripting
Om forfatteren Michael McConnell(44 artikler udgivet)

Michael brugte ikke en Mac, da de var dødsdømt, men han kan kode i Applescript. Han har uddannelser i datalogi og engelsk; han har skrevet om Mac, iOS og videospil i et stykke tid nu; og han har været en it -abe i dagtimerne i over et årti med speciale i scripting og virtualisering.

filnavnet er for langt til at slette
Mere fra Michael McConnell

Abonner på vores nyhedsbrev

Tilmeld dig vores nyhedsbrev for at få tekniske tips, anmeldelser, gratis e -bøger og eksklusive tilbud!

Klik her for at abonnere