Hoe Powershell Foreach, While en Other Loops werken
Een cruciale eerste stap in het leren van programmeren is werken met loops. De absolute grondbeginselen van programmeren voor beginners (deel 2) De absolute basis van programmeren voor beginners (deel 2) In deel 2 van onze absolute beginnersgids voor programmeren, behandel ik de basis van functies, retourwaarden, loops en conditionals. Zorg ervoor dat je deel 1 hebt gelezen voordat je dit aanpakt, waar ik de ... Lees Meer heb uitgelegd. Gelukkig blijft PowerShell groeien met uw vaardigheden.
U kunt de bestaande opdrachten die u dagelijks in loops gebruikt, omlijsten om tijd en moeite te besparen. Je scripts doen het zware werk terwijl je 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.
Zoals de meeste moderne programmeertalen, is PowerShell objectgeoriënteerd. Waar kwam "objectgeoriënteerd" programmeren vandaan? Waar kwam "objectgeoriënteerde" programmering zijn naam vandaan? Objectgeoriënteerd is niet zomaar een willekeurig buzzwoord dat je in programmeerkringen hoort. Er zit een reden achter de naam - maar wat? Ga met me mee als ik enkele basisprincipes van programmeerconcepten verken en uitleg geef ... Lees meer. Alles in PowerShell is een object, wat betekent dat zelfs variabelen uitgebreide eigenschappen en functies hebben Powershell-cmdlets die uw Windows-beheerdersvaardigheden verbeteren Powershell-cmdlets die uw Windows-beheerdersvaardigheden verbeteren Powershell is gelijkwaardig commandoregelhulpmiddel en scripttaal. Het geeft u de mogelijkheid om uw computer te automatiseren via dezelfde opdrachten die u gebruikt om het te beheren. Lees verder . Met die eigenschap kunt u uw zoekopdrachten instellen op een variabele en eindigen met een reeks resultaten.
$ yourVar = Get-ChildItem * foreach ($ file in $ yourVar) Your Steps
In sommige talen zou het verwerken van deze array een proces van meerdere stappen zijn. Eerst de lengte bepalen en vervolgens elke stap optellen.
In PowerShell doorloopt u de array en voert u de actie uit op elke die ForEach gebruikt. Dit bespaart u verschillende coderegels, wat handig is als u een langer script hebt. Het volgende is bijvoorbeeld een klein script dat een paar Powershell ForEach-loops zou gebruiken. Het maakt een ZIP-archief van al uw bestanden die u niet binnen 30 dagen hebt geopend.
Een archiefsysteem voor bestanden maken met ForEach Loops
Laten we de stappen naar beneden halen. Je gebruikt Get-ChildItem om alle bestanden in de map Documenten te krijgen. De omgevingsvariabele Wat zijn omgevingsvariabelen en hoe kan ik ze gebruiken? [Windows] Wat zijn omgevingsvariabelen en hoe kan ik ze gebruiken? [Windows] Zo nu en dan zal ik een kleine tip leren die me doet denken "nou, als ik dat een jaar geleden al kende, zou het mij uren tijd hebben bespaard". Ik herinner me levendig hoe ik ... Lees meer $ Env: USERPROFILE voert het script uit met behulp van het huidige profiel. Deze variabele is draagbaarder dan een hardcoded pad. De resultaten van die zoekopdracht worden toegewezen aan de variabele $ MyDocs. Vervolgens maken we onze ForEach-lus door elke stap te doorlopen $ 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 (testpad $ destination) Remove-Item -Path $ ArchiveFolder -Recurse -Confirm $ false
Binnen in de loop controleren we of elk bestand is LastAccessTime eigendom is ouder dan 30 dagen. We krijgen dit met de Krijg datum cmdlet en gebruik de AddDays functioneren met negatieve dertig. Als dat zo is, voegen we het bestand toe aan de $ myOldDocs matrix. Nadat de bestandssortering is voltooid, nemen we vervolgens de voltooide array en maken we een zipbestand. Dit proces is een beetje ingewikkelder omdat het een beetje .NET inroept. Maak je geen zorgen als je het niet helemaal begrijpt. Je kunt de code stelen van dit TechNet-helpdocument.
Om op te splitsen wat hier gebeurt: we zullen al onze oude bestanden verplaatsen naar een nieuwe map met de naam voor de huidige datum voor ouder dan 30 dagen. Zodra die map is opgebouwd, moeten we het ZIP-archief met dezelfde naam maken. We zullen testen om te controleren of het archief is geslaagd en het .ZIP-bestand is daar en verwijder vervolgens de nieuwe map. Stel dit in als een geplande taak die eenmaal per maand wordt uitgevoerd. U bespaart uzelf een beetje ruimte en houdt uw map Documenten schoon.
While and Do While: Loops on Condition
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 dat eerst in.
i = 0 terwijl (d.w.z.<10) Your Steps i+=1
Het probleem is dat als u geen teller gebruikt, u wellicht wilt dat uw 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 doe-while-lus gebruiken Hoe doe-terwijl Loops werken in computerprogrammeren Hoe doe-terwijl Loops werken in computerprogrammering Loops zijn een van de eerste besturingstypen die je bij het programmeren leert. Je weet waarschijnlijk wel over while en for loops, maar wat bereikt een do-while-lus? Lees verder . De syntaxis is iets anders.
doe Your Steps while (Conditional Statement)
Het gebruik van deze is niet zo vanzelfsprekend voor een beginnende programmeur. Als je typische dagelijkse scripts uitvoert, kom je ze misschien niet vaak tegen. Waar ze vooral van pas komen, is om een geïmproviseerde timer te maken om het succes van een proces te testen.
We gaan een snel script maken om een externe machine opnieuw op te starten en te waarschuwen als het binnen 15 minuten niet weer op komt. In dit scenario wordt aangenomen dat het een basisserver of een andere machine is die niet vaak opnieuw opstart. U kunt de tijd aanpassen als uw computer doorgaans sneller wordt gebruikt.
Herstarten en controleren: een doe-het-tijd-loop gebruiken
Dit script is een beetje eenvoudiger. Eerst gebruikt u de Herstart computer opdracht om de externe machine opnieuw op te starten. (We gebruikten hier een dummy IP voor de reboot-opdrachten, zorg ervoor dat u dit overschrijft met de DNS / IP van uw computer). Maak vervolgens de tellervariabele, ik en stel het in op 0. Vervolgens heeft u uw Do-lus met Start-Sleep die het script gedurende 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)) -of $ i -gt 3) if ( $ i -gt 3) Write-Ouput "Remote Machine reageert niet, controleer." else Write-Output "Reboot Succeeded"
Dan hebben we onze While-criteria. We gebruiken een test of ervoor zorgen dat een fout een waarschuwing genereert. Het alternatief is het script dat eindeloos op de externe machine wacht. 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 True of False retourneert in plaats van de resultaten van de pakketten. Het tweede deel van de instructie Or controleert of de teller meer dan drie is.
Zodra de lus is voltooid, willen we de uitvoer maken. Dat betekent dat we onze balie moeten controleren. Dit is een snelle if / else-instructie. Als het groter is dan drie, wordt in het script uitgegaan dat het externe apparaat niet reageert. Als dit niet het geval is, wordt het opnieuw opstarten uitgevoerd.
Andere loops
Er zijn twee andere soorten lussen beschikbaar in PowerShell. Ze zijn enigszins gerelateerd aan de vorige twee loops, ze zijn gewoon niet zo vaak gebruikt. Een For-lus werkt op dezelfde manier als het While-voorbeeld. U stelt al uw criteria in bij de evaluatie en stelt vervolgens uw cmdlets in.
for ($ i = 0; $ i -lt 10; $ i ++) Your Steps
Doe Tot loops zoals Do While loops zijn, verander je de While-opdracht in Until. In het voorbeeldscript zou hetzelfde hetzelfde zijn als gedrag. Het is een stijlkeuze, maar de Do While is veelzijdiger in andere situaties. Dus als je er maar een onthoudt, is Do While nuttiger.
PowerShell biedt ook hulp voor elk van deze lussen. U kunt de hulp krijgen door toe te voegen wat betreft voor de naam van de lus in Get-Help. U kunt vervolgens voorbeelden en andere tips voor elk type bekijken. Deze zouden handig moeten zijn als je vastloopt.
Blijf groeien met jou
Op dit punt heb je de meeste vaardigheden om robuuste scripts te bouwen. Of het nu gaat om het automatiseren van uw thuisplatform 15 Geavanceerde taken PowerShell kan overweg met Windows 10 15 Geavanceerde taken PowerShell kan overweg met Windows 10 PowerShell lijkt op de opdrachtprompt, maar beter. Het is een krachtige tool voor systeembeheer. We hebben 15 taken samengesteld, sommige eenvoudig, sommige complex, die profiteren van de magie van PowerShell. Lees meer of bespaar tijd op het werk, loops helpen je scripts om meer te doen. Door deze lussen te combineren met foutafhandeling wordt uw scripting verder dan de basis. Omgaan met PowerShell-fouten als een baas met deze tips Omgaan met PowerShell-fouten als een baas met deze tips Er zijn vier onderdelen voor PowerShell-foutafhandeling: de parameter Error Action, Try / Catch-blokken, de Foutvariabele parameter en logging. Leer hoe u ze allemaal kunt doen. Lees verder . Dit opent de deur naar meer geavanceerde talen.
Wat is een slim PowerShell-script dat u met behulp van loops hebt gemaakt? Deel het met ons in de comments.
Ontdek meer over: PowerShell, Scripting.