Cum funcționează Powershell Foreach, în timp ce și alte bucle

Cum funcționează Powershell Foreach, în timp ce și alte bucle / Programare

Un prim pas crucial in invatarea programarii este lucrul cu buclele. Bazele absolutului de programare pentru incepatori (partea 2) Bazele absolutului de programare pentru incepatori (Partea 2) In partea a 2 a ghidului nostru absolut de incepatori pentru programare, voi acoperi elementele de bază ale funcțiilor, valorile returnate, buclele și condiționările. Asigurați-vă că ați citit partea 1 înainte de a aborda acest lucru, unde i-am explicat ... Citește mai mult. Din fericire, PowerShell continuă să crească cu abilitățile tale.

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

Powershell ForEach Loops: Ușile pentru manipularea avansată a datelor

ForEach este aliasul pentru Obiectul ForEach. (Un Alias ​​este doar o scurtătură pentru o comandă în PowerShell.) Acesta este un moment bun pentru a vorbi despre modul în care PowerShell se ocupă de date.

La fel ca majoritatea limbajelor de programare moderne, PowerShell este orientat pe obiecte Unde a fost programat "Object Oriented" Programming? Unde a fost programat Object Oriented Programming? Object Oriented nu este doar un buzzword aleator pe care îl auziți în cercurile de programare. Există un motiv în spatele numelui - dar ce? Alăturați-vă cum explorez câteva dintre fundamentele conceptelor de programare și explic ... Citește mai mult. Totul în PowerShell este un obiect, ceea ce înseamnă că chiar și variabilele au proprietăți și funcții extinse Powershell Cmdlets care vă vor îmbunătăți abilitățile de administrare Windows Powershell Cmdlets care vă vor îmbunătăți abilitățile de administrare Windows Powershell este un instrument de linie egal pentru părți de comandă și limbaj de scripting. Vă oferă posibilitatea de a automatiza computerul prin aceleași comenzi pe care le utilizați pentru a le administra. Citeste mai mult . Această proprietate este motivul pentru care puteți să vă setați căutările la o variabilă și să ajungeți la o serie de rezultate.

$ yourVar = Get-ChildItem * foreach (fișier $ în $ yourVar) Pașii dvs. 

În unele limbi, procesarea acestei matrice ar fi un proces în mai multe etape. Mai întâi, obțineți lungimea și apoi numărați 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 text este un script mic care ar folosi câteva bucle Powershell ForEach. Creează o arhivă ZIP a tuturor fișierelor pe care nu le-ai deschis în 30 de zile.

Construirea unui sistem de arhivare a fișierelor utilizând formele ForEach

Să facem pașii jos. Să utilizați Get-ChildItem pentru a obține toate fișierele din dosarul Documente. Variabila de mediu Care sunt variabilele de mediu și cum le pot folosi? [Windows] Care sunt variabilele de mediu și cum le pot folosi? [Windows] Din când în când, voi învăța un mic sfat care mă face să mă gândesc "bine, dacă știu că acum un an mi-ar fi salvat ore întregi". Îmi amintesc în mod viu cum să ... Citește mai mult $ Env: USERPROFILE rulează scriptul utilizând profilul curent. Această variabilă este mai portabilă decât o cale hardcoded. Rezultatele acelei căutări sunt atribuite variabilei $ MyDocs. Apoi, creăm buclele ForEach, trecând prin fiecare $ Doc în $ MyDocs.

$ oldDocs = @ () $ MyDocs = Get-ChildItem -Path "$ ($ env: USERPROFILE) \ Documents" -Recurse foreach ($ doc în $ MyDocs) if ($ doc.LastAccessTime -lt $ (Get-Date) .ddDays (-30)) $ oldDocs + = $ doc $ ArhivăFolder = Un nou element -Path "$ ($ env: USERPROFILE) \ Documents \ $ (Get-Date -Format MMddyy) "-ItemType Directory foreach ($ doc în $ oldDocs) Move-Item -Path $ doc.FullName -Destinare" $ ($ ArchiveFolder.FullName) \ $ ($ doc.Name) "-Confirm $ false $ source = $ ArchiveFolder.FullName $ destination = "$ ($ env: USERPROFILE) \ Documents \ $ ($ ArchiveFolder.Name) .zip" Add-Type -AssemblyName "sistem.io.compression.filesystem" [io.compression.zipfile] CreateFromDirectory ($ source, $ destination) dacă (test-path $ destination) Elimină-Articol -Path $ ArhivăFolder -Recurse -Confirm $ false 

În interiorul buclei, verificăm dacă fiecare fișier este LastAccessTime Proprietatea este mai veche de 30 de zile. Avem acest lucru cu Get-Data cmdlet și folosind AddDays funcție cu treizeci negativ. Dacă este, adăugăm fișierul la $ myOldDocs matrice. După ce sortarea fișierelor este finalizată, luăm matricea completă și creăm un fișier zip. Acest proces este un pic mai complicat, deoarece implică invocarea unui pic de .NET. Nu vă faceți griji dacă nu o înțelegeți - puteți fura codul din documentul de ajutor TechNet.

Pentru a rupe ceea ce se întâmplă aici: Vom muta toate fișierele noastre vechi într-un nou director numit pentru data de astăzi pentru mai mult de 30 de zile. După crearea folderului, trebuie să creați arhiva ZIP cu același nume. Vom testa pentru a vă asigura că arhiva a reușit și că fișierul .ZIP este acolo și apoi ștergeți noul dosar. Setați-o ca o sarcină programată pentru a rula o dată pe lună. Veți economisi puțin spațiu și păstrați dosarul Documente curat.

În timp și în timp ce: Buclele pe condiție

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

i = 0 în timp ce (i<10) Your Steps i+=1  

Problema este că dacă nu utilizați un contor, s-ar putea să doriți ca codul dvs. să ruleze cel puțin o dată, chiar dacă testul este adevărat. Acesta este cazul scenariului de mai jos. Deci, în acele cazuri, doriți să utilizați o buclă Do-While Cum funcționează în timp ce bușierele lucrează în programarea computerului Cum funcționează în timp ce circuitele lucrează în programarea calculatoarelor Buclele sunt unul dintre primele tipuri de control pe care le veți învăța în programare. Probabil știți despre timp și pentru bucle, dar ce realizează o buclă de timp? Citeste mai mult . Sintaxa este ușor diferită.

efectuați Steps în timp ce (Declarație condiționată) 

Folosirea acestora nu este la fel de evidentă pentru un programator novice. Făcând scripturi obișnuite de zi cu zi, este posibil să nu fugi în ele de multe ori. În cazul în care acestea vin în special la îndemână este de a face un cronometru improvizat pentru a testa succesul unui proces.

Vom construi un script rapid pentru a reporni o mașină de la distanță și a alerta dacă nu va reveni în 15 minute. Acest scenariu presupune că este un server de acasă sau altă mașină care nu se reboot foarte des. Simțiți-vă libertatea de a ajusta timpul în cazul în care computerul dvs. de obicei vine mai repede.

Reporniți și verificați: utilizând o buclă Do-While

Acest script este un pic mai simplu. În primul rând, utilizați Restart-calculator comanda pentru a reporni mașina de la distanță. (Am folosit aici o IP falsă pentru comenzile de repornire, asigurați-vă că o suprascrieți cu DNS / IP). Apoi creați variabila contra, eu și setați-l la 0. Apoi, aveți buclă Do cu Start-Sleep oprind scriptul timp de 300 de secunde (cinci minute). O a doua comandă adaugă una la contor.

Reporniți-Computer -ComputerName 127.0.0.1 i = 0 faceți clic pe Start-Sleep -Seconds 300 $ i + = 1 în timp ce ((! (Test-Connection 127.0.0.1 -Quiet)) - sau $ i -gt 3) $ i-gt 3) Write-Ouput "Mașina de la distanță nu răspunde, vă rugăm să verificați."  altceva Write-Output "Reboot Succeeded" 

Apoi avem criteriile noastre În timp. Utilizăm testul Or, pentru a ne asigura că un eșec generează o alertă. O alternativă este șirul de buclă care așteaptă fără sfârșit mașina de 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 care îl forțează să se întoarcă la True sau False mai degrabă decât la rezultatele pachetelor. A doua parte a instrucțiunii Or verifică dacă contorul este mai mare de trei.

Odată ce bucla este terminată, dorim 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, script-urile afișează că aparatul de la distanță nu răspunde. Dacă nu, rezultă că rebootul a avut succes.

Alte bucle

Există alte două tipuri de bucle disponibile în PowerShell. Ele sunt oarecum legate de cele două bucle anterioare, ele nu sunt la fel de frecvent utilizate. O buclă For funcționează similar cu exemplul In timp. Stabiliți toate criteriile dvs. în evaluare, apoi setați cmdleturile.

pentru ($ i = 0; $ i -lt 10; $ i ++) pașii dvs. 

Do Until buclele sunt ca buclele Do While, tocmai schimbați instrucțiunea În timp până la Until. În scenariul de exemplu, ar fi același în ceea ce privește comportamentul. Este o alegere de stil, dar Do In timp este mai versatil in alte situatii. Deci, dacă vă amintiți doar unul, În timp ce 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 de ajutor dacă rămâneți 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ă automatizați platforma de acasă 15 Sarcini avansate PowerShell se pot ocupa în Windows 10 15 Sarcini avansate PowerShell se pot ocupa în Windows 10 PowerShell este similar cu promptul de comandă, dar mai bine. Este un instrument puternic de administrare a sistemului. Am compilat 15 sarcini, unele simple, unele complexe, care beneficiază de magia PowerShell. Citește mai mult sau economisiți timp la lucru, buclele ajută scripturile dvs. să facă mai mult. Combinarea acestor bucle cu manipularea erorilor mișcă scripturile dincolo de elementele de bază Gestionați erorile PowerShell ca un șef cu aceste sfaturi Manipulați erorile PowerShell ca un șef cu aceste sfaturi Există patru părți pentru manipularea erorilor PowerShell: parametrul Error Action, Try / Catch blocks Eroare parametru variabil și logare. Aflați cum să le faceți pe toate. Citeste mai mult . Acest lucru deschide ușa unor limbi mai avansate.

Ce este un script PowerShell inteligent creat folosind bucle? Împărtășește-i cu noi în comentarii.

Explorați mai multe despre: PowerShell, Scripting.