Hur Powershell Foreach, While och andra slingor fungerar

Hur Powershell Foreach, While och andra slingor fungerar

Ett avgörande första steg för att lära sig programmering är att arbeta med loopar. Tack och lov fortsätter PowerShell att växa med dina färdigheter.





hur man använder wii u gamepad på PC

Du kan rama in de befintliga kommandon du använder varje dag i loopar för att spara tid och ansträngning. Dina manus gör det tunga medan du gör det viktiga arbetet med att läsa fler artiklar på MakeUseOf!





Powershell för varje slinga: dörren till avancerad datahantering

ForEach är aliaset för ForEach-Object. (Ett alias är bara en genväg för ett kommando i PowerShell.) Det här är en bra tid att prata om hur PowerShell hanterar data.





Precis som de flesta moderna programmeringsspråk är PowerShell objektorienterat. Allt i PowerShell är ett objekt, vilket betyder att även variabler har utökade egenskaper och funktioner . Den egenskapen är anledningen till att du kan ställa in dina sökningar till en variabel och sluta med en rad resultat.

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

På vissa språk skulle bearbetning av denna array vara en process i flera steg. Först få längden och sedan räkna upp varje steg.



I PowerShell går du igenom matrisen och utför åtgärden på var och en med ForEach. Detta sparar dig flera rader kod, vilket är användbart om du har ett längre skript. Till exempel är följande ett litet skript som skulle använda ett par Powershell ForEach -slingor. Det skapar ett ZIP -arkiv med alla dina filer som du inte har öppnat på 30 dagar.

Bygga ett filarkivsystem med hjälp av ForEach Loops

Låt oss bryta ner stegen. Du använder Get-ChildItem för att få alla filer i mappen Dokument. Miljövariabeln $ env: ANVÄNDARPROFIL kör skriptet med den aktuella profilen. Denna variabel är mer portabel än en hårdkodad sökväg. Resultaten av den sökningen tilldelas variabeln $ MyDocs . Vi skapar sedan vår ForEach -slinga genom att låta den gå igenom varje $ 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
}

Inuti slingan kontrollerar vi om varje fil är LastAccessTime fastigheten är äldre än 30 dagar. Vi får detta med Get-Date cmdlet och med AddDays funktion med negativ trettio. Om så är fallet lägger vi till filen i $ myOldDocs array. När filsorteringen är klar tar vi vår färdiga matris och skapar en zip -fil. Denna process är lite mer komplicerad eftersom det innebär att man anropar lite .NET. Oroa dig inte om du inte riktigt fattar det - du kan stjäla koden från detta TechNet hjälpdokument .

För att bryta ner vad som händer här: Vi kommer att flytta alla våra gamla filer till en ny katalog som heter dagens datum för äldre än 30 dagar. När den mappen har byggts måste vi skapa ZIP -arkivet med samma namn. Vi testar för att se till att arkivet lyckades och .ZIP -filen finns där och tar sedan bort den nya mappen. Ange detta som en schemalagd uppgift för att köras en gång i månaden. Du sparar lite utrymme och håller mappen Dokument ren.





While and Do While: Slingor på skick

Om du bara vill köra en loop när ett visst villkor är uppfyllt använder du en While -loop. Om du använder en variabel för att spåra räkningen, ställ in det först.

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

Problemet är att om du inte använder en räknare kanske du vill att din kod ska köras minst en gång även om testet är sant. Detta är fallet med exempelskriptet nedan. Så i dessa fall vill du använda en Do-While-slinga. Syntaxen är något annorlunda.

do{
Your Steps
}while(Conditional Statement)

Att använda dessa är inte lika självklart för en nybörjare programmerare. Om du gör vanliga skript från dag till dag kanske du inte stöter på dem så ofta. Där de är särskilt användbara är att göra en provisorisk timer för att testa framgången för en process.

hur man krymper en jpeg -filstorlek

Vi ska bygga ett snabbt skript för att starta om en fjärrmaskin och varna om det inte återkommer inom 15 minuter. Detta scenario förutsätter att det är en hemmaserver eller annan maskin som inte startar om ofta. Justera gärna tiden om din dator vanligtvis kommer upp snabbare.

Starta om och kontrollera: Använd en do-while-loop

Detta manus är lite enklare. Först använder du Starta om dator kommando för att starta om fjärrmaskinen. (Vi använde en dummy -IP här för omstartskommandona, var noga med att skriva över detta med din dators DNS/IP). Skapa sedan räknevariabeln, i och ställ den till 0. Därefter har du din Do-loop med Start-Sleep som stoppar manuset i 300 sekunder (fem minuter). Ett andra kommando lägger till ett till räknaren.

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

Sedan har vi våra While -kriterier. Vi använder ett Or -test för att säkerställa att ett fel genererar en varning. Alternativet är att skriptet slingrar oändligt i väntan på fjärrmaskinen. För att kontrollera maskinen använder vi Testanslutning cmdlet. För enkelhetens skull är detta Ping för PowerShell. Vi lägger till parametern -Tyst vilket tvingar den att returnera Sant eller Falskt snarare än resultaten av paketen. Den andra delen av Or -satsen kontrollerar om räknaren är mer än tre.

När slingan är klar vill vi skapa utdata. Det betyder att vi måste kontrollera vår räknare. Detta är ett snabbt if/else -uttalande. Om det är större än tre matas det ut från skriptet att fjärrdatorn inte svarar. Om det inte är det kommer det ut att omstarten lyckades.

Andra slingor

Det finns två andra typer av slingor tillgängliga i PowerShell. De är något relaterade till de två föregående slingorna, de är bara inte lika vanliga. En For -loop fungerar på samma sätt som While -exemplet. Du ställer in alla dina kriterier i utvärderingen och ställer sedan in dina cmdlets.

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

Gör tills -slingor är som Gör medan -slingor, du ändrar bara medan -uttalandet till Till. I exempelskriptet skulle det vara samma för beteende. Det är ett stilval, men Do While är mer mångsidig i andra situationer. Så om du bara kommer ihåg en är Do While mer användbar.

PowerShell har också hjälp för var och en av dessa loopar. Du kan få hjälp genom att lägga till handla om före loop-namnet i Get-Help. Du kan sedan se exempel och andra tips för varje typ. Dessa bör vara till hjälp om du fastnar.

Fortsätter att växa med dig

Vid denna tidpunkt har du de flesta färdigheterna för att börja bygga robusta skript. Oavsett om du automatiserar din hemmarigg eller sparar tid på jobbet, hjälper loopar dina skript att göra mer. Att kombinera dessa loopar med felhantering flyttar ditt skript bortom grunderna. Detta öppnar dörren till mer avancerade språk.

Vad är ett smart PowerShell -skript du har skapat med hjälp av loopar? Dela det med oss ​​i kommentarerna.

Dela med sig Dela med sig Tweet E-post Ta bort dessa Windows -filer och mappar för att frigöra diskutrymme

Behöver du rensa diskutrymme på din Windows -dator? Här är Windows -filer och mappar som säkert kan raderas för att frigöra diskutrymme.

Läs Nästa
Relaterade ämnen
  • Programmering
  • PowerShell
  • Scripting
Om författaren Michael McConnell(44 artiklar publicerade)

Michael använde inte en Mac när de var dömda, men han kan koda i Applescript. Han har examen i datavetenskap och engelska; han har skrivit om Mac, iOS och videospel ett tag nu; och han har varit en IT -apa på dagtid i över ett decennium, specialiserat sig på scripting och virtualisering.

hitta en bok efter beskrivning av tomten
Mer från Michael McConnell

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e -böcker och exklusiva erbjudanden!

Klicka här för att prenumerera