Cum funcționează Powershell Foreach, While și alte bucle

Cum funcționează Powershell Foreach, While și alte bucle

Un prim pas crucial în învățarea programării este lucrul cu bucle. Din fericire, PowerShell continuă să crească cu abilitățile tale.





cum să activați fotografiile facetime

Puteți încadra comenzile existente pe care le utilizați în fiecare zi în bucle pentru a economisi timp și efort. Scripturile dvs. fac greutăți în timp ce faceți munca importantă de a citi mai multe articole pe MakeUseOf!





Powershell pentru fiecare buclă: ușa către gestionarea avansată a datelor

ForEach este aliasul pentru ForEach-Object. (Un Alias ​​este doar o comandă rapidă pentru o comandă în PowerShell.) Acesta este un moment bun pentru a vorbi despre modul în care PowerShell gestionează datele.





La fel ca majoritatea limbajelor de programare moderne, PowerShell este orientat pe obiecte. Totul din PowerShell este un obiect, adică chiar variabile au proprietăți și funcții extinse . Această proprietate este motivul pentru care puteți seta căutările la o variabilă și puteți termina cu o serie de rezultate.

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

În unele limbi, procesarea acestui tablou ar fi un proces cu mai multe etape. Mai întâi, obținând lungimea și apoi numărând fiecare pas.



În PowerShell, treceți prin matrice și efectuați acțiunea pe fiecare folosind ForEach. Acest lucru vă salvează mai multe linii de cod, ceea ce este util dacă aveți un script mai lung. De exemplu, următorul este un mic script care ar folosi câteva bucle Powershell ForEach. Se creează o arhivă ZIP a tuturor fișierelor pe care nu le-ați deschis de 30 de zile.

Construirea unui sistem de arhivare a fișierelor folosind bucle ForEach

Să rupem treptele. Să utilizați Get-ChildItem pentru a obține toate fișierele din folderul Documente. Variabila de mediu $ env: PROFIL UTILIZATOR rulează scriptul utilizând profilul curent. Această variabilă este mai portabilă decât o cale codificată. Rezultatele acelei căutări sunt atribuite variabilei $ MyDocs . Apoi ne creăm bucla ForEach făcându-o să treacă prin fiecare $ Doc în $ 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
}

În interiorul buclei, verificăm dacă fiecare fișier este LastAccessTime proprietatea este mai veche de 30 de zile. Obținem acest lucru cu Get-Date cmdlet și folosind AddDays funcție cu treizeci negative. Dacă este, adăugăm fișierul la $ myOldDocs matrice. După finalizarea sortării fișierelor, luăm matricea finalizată și creăm un fișier zip. Acest proces este puțin mai complicat, deoarece implică invocarea unui pic de .NET. Nu vă faceți griji dacă nu îl înțelegeți - puteți fura codul acest document de ajutor TechNet .

Pentru a defini ceea ce se întâmplă aici: Vom muta toate fișierele noastre vechi într-un nou director numit pentru data de astăzi cu o vechime mai mare de 30 de zile. Odată ce acel folder se construiește, trebuie să creăm arhiva ZIP cu același nume. Vom testa pentru a ne asigura că arhiva a reușit și că fișierul .ZIP este acolo, apoi vom șterge noul folder. Setați acest lucru ca o sarcină programată pentru a rula o dată pe lună. Vă veți economisi puțin spațiu și vă veți păstra folderul Documente curat.





While și Do While: bucle la condiție

Dacă doriți să rulați o buclă numai atunci când este îndeplinită o anumită condiție, utilizați o buclă While. Dacă utilizați o variabilă pentru a urmări numărarea, setați-o mai întâi.

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

Problema este că, dacă nu utilizați un contor, este posibil să doriți ca codul dvs. să ruleze cel puțin o dată, chiar dacă testul este adevărat. Acesta este cazul cu exemplul de script de mai jos. Deci, în aceste cazuri, doriți să utilizați o buclă Do-While. Sintaxa este ușor diferită.

do{
Your Steps
}while(Conditional Statement)

Folosirea acestora nu este la fel de evidentă pentru un programator începător. Dacă faceți scripturi obișnuite de zi cu zi, este posibil să nu vă întâlniți atât de des. În cazul în care acestea sunt deosebit de utile este să creați un temporizator improvizat pentru testarea succesului unui proces.

poți dezactiva pe cineva pe instagram

Vom construi un script rapid pentru a reporni o mașină la distanță și avertiza dacă nu revine în 15 minute. Acest scenariu presupune că este un server de acasă sau o altă mașină care nu repornește foarte des. Simțiți-vă liber să reglați timpul dacă computerul dvs. apare de obicei mai repede.

Reporniți și verificați: utilizarea unui buclă Do-While

Acest script este puțin mai simplu. În primul rând, utilizați Reporniți computerul comandă pentru a reporni aparatul la distanță. (Am folosit un IP fals aici pentru comenzile de repornire, asigurați-vă că suprascrieți acest lucru cu DNS / IP al computerului). Apoi creați variabila contor, eu și setați-l la 0. Apoi, aveți bucla Do cu Start-Sleep oprind scriptul timp de 300 de secunde (cinci minute). O a doua comandă adaugă una la tejghea.

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

Apoi avem criteriile noastre While. Folosim un test Sau pentru a ne asigura că o eroare generează o alertă. Alternativa este scriptul în buclă care așteaptă la nesfârșit mașina la distanță. Pentru a verifica mașina, folosim Test de conexiune cmdlet. Pentru simplitate, acesta este Ping pentru PowerShell. Adăugăm parametrul -Liniște ceea ce îl obligă să returneze mai degrabă True sau False decât rezultatele pachetelor. A doua parte a declarației Or verifică dacă contorul este mai mare de trei.

Odată ce bucla se finalizează, vrem să creăm ieșirea. Asta înseamnă că trebuie să ne verificăm contorul. Aceasta este o declarație rapidă if / else. Dacă este mai mare de trei, scriptul arată că aparatul la distanță nu răspunde. Dacă nu este, rezultă că repornirea a avut succes.

Alte bucle

Există alte două tipuri de bucle disponibile în PowerShell. Sunt oarecum legate de cele două bucle anterioare, pur și simplu nu sunt la fel de frecvent utilizate. O buclă For funcționează similar cu exemplul While. Setați toate criteriile în evaluare, apoi setați cmdleturile.

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

Buclele Do Until sunt ca buclele Do While, trebuie doar să schimbați instrucțiunea While până la Until. În scriptul de exemplu, ar fi același în ceea ce privește comportamentul. Este o alegere de stil, dar Do While este mai versatil în alte situații. Deci, dacă vă amintiți doar unul, Do While este mai util.

PowerShell are ajutor și pentru fiecare dintre aceste bucle. Puteți obține ajutorul adăugând despre înainte de numele buclei din Get-Help. Apoi puteți vedea exemple și alte sfaturi pentru fiecare tip. Acestea ar trebui să fie utile dacă vă blocați.

Continuând să crești cu tine

În acest moment, aveți cele mai multe abilități pentru a începe să construiți scripturi robuste. Indiferent dacă vă automatizează echipamentul de acasă sau economisiți timp la locul de muncă, buclele vă ajută scripturile să facă mai mult. Combinarea acestor bucle cu gestionarea erorilor vă mută scriptul dincolo de elementele de bază. Acest lucru deschide ușa către limbi mai avansate.

Ce este un script inteligent PowerShell pe care l-ați creat folosind bucle? Împărtășiți-l cu noi în comentarii.

Acțiune Acțiune Tweet E-mail Ștergeți aceste fișiere și foldere Windows pentru a elibera spațiu pe disc

Aveți nevoie să goliți spațiul pe disc pe computerul dvs. Windows? Iată fișierele și folderele Windows care pot fi șterse în siguranță pentru a elibera spațiu pe disc.

Citiți în continuare
Subiecte asemănătoare
  • Programare
  • PowerShell
  • Scripting
Despre autor Michael McConnell(44 articole publicate)

Michael nu a folosit un Mac când erau condamnați, dar poate codifica în Applescript. Este licențiat în informatică și engleză; scrie de ceva timp despre Mac, iOS și jocuri video; și este o maimuță IT de zi de peste un deceniu, specializată în scripturi și virtualizare.

diferența dintre un monitor și un televizor
Mai multe de la Michael McConnell

Aboneaza-te la newsletter-ul nostru

Alăturați-vă newsletter-ului pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!

Faceți clic aici pentru a vă abona