Jak działa Powershell foreach, while i inne pętle

Jak działa Powershell foreach, while i inne pętle

Kluczowym pierwszym krokiem w nauce programowania jest praca z pętlami. Na szczęście PowerShell rozwija się wraz z Twoimi umiejętnościami.





aplikacja, która mówi, jaki utwór jest odtwarzany

Istniejące polecenia, których używasz na co dzień, możesz umieścić w pętlach, aby zaoszczędzić czas i wysiłek. Twoje skrypty wykonują ciężką pracę, podczas gdy ty wykonujesz ważną pracę polegającą na czytaniu większej liczby artykułów na temat MakeUseOf!





Pętle Powershell ForEach: drzwi do zaawansowanej obsługi danych

ForEach to alias obiektu ForEach. (Alias ​​to tylko skrót do polecenia w PowerShell.) To dobry moment, aby porozmawiać o sposobie, w jaki PowerShell obsługuje dane.





Podobnie jak większość nowoczesnych języków programowania, PowerShell jest zorientowany obiektowo . Wszystko w PowerShell jest obiektem, co oznacza, że ​​nawet zmienne mają rozszerzone właściwości i funkcje . Ta właściwość jest powodem, dla którego możesz ustawić swoje wyszukiwania na zmienną i otrzymać tablicę wyników.

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

W niektórych językach przetwarzanie tej tablicy byłoby procesem wieloetapowym. Najpierw zbierz długość, a następnie odlicz każdy krok.



W PowerShell przechodzisz przez tablicę i wykonujesz akcję na każdym z nich za pomocą ForEach. Pozwala to zaoszczędzić kilka linijek kodu, co jest przydatne, jeśli masz dłuższy skrypt. Na przykład poniżej znajduje się mały skrypt, który używałby kilku pętli Powershell ForEach. Tworzy archiwum ZIP wszystkich plików, których nie otwierałeś w ciągu 30 dni.

Budowanie systemu archiwizacji plików za pomocą pętli ForEach

Przełammy kroki w dół. Używasz Get-ChildItem aby pobrać wszystkie pliki w folderze Dokumenty. Zmienna środowiskowa $env:PROFIL UŻYTKOWNIKA uruchamia skrypt przy użyciu bieżącego profilu. Ta zmienna jest bardziej przenośna niż ścieżka zakodowana na stałe. Wyniki tego wyszukiwania są przypisane do zmiennej $ Moje Dokumenty . Następnie tworzymy naszą pętlę ForEach, przechodząc przez każdą z nich $Doc w $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
}

Wewnątrz pętli sprawdzamy, czy każdy plik jest LastAccessTime nieruchomość jest starsza niż 30 dni. Dostajemy to z Pobierz datę polecenia cmdlet i za pomocą AddDays funkcja z ujemną trzydziestką. Jeśli tak, dodajemy plik do $myOldDocs szyk. Po zakończeniu sortowania plików pobieramy wypełnioną tablicę i tworzymy plik zip. Ten proces jest nieco bardziej skomplikowany, ponieważ wymaga wywołania trochę .NET. Nie martw się, jeśli nie do końca rozumiesz – możesz ukraść kod ten dokument pomocy TechNet .

Aby podzielić to, co się tutaj dzieje: Przeniesiemy wszystkie nasze stare pliki do nowego katalogu o nazwie odpowiadającej dzisiejszej dacie starszej niż 30 dni. Po utworzeniu tego folderu musimy utworzyć archiwum ZIP o tej samej nazwie. Przetestujemy, aby upewnić się, że archiwum się powiodło i plik .ZIP jest tam, a następnie usuniemy nowy folder. Ustaw to jako zaplanowane zadanie, które będzie uruchamiane raz w miesiącu. Zaoszczędzisz trochę miejsca i utrzymasz czysty folder Dokumenty.





While and Do While: Loops on Condition

Jeśli chcesz uruchomić pętlę tylko wtedy, gdy zostanie spełniony określony warunek, użyj pętli While. Jeśli używasz zmiennej do śledzenia zliczania, ustaw ją najpierw.

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

Problem polega na tym, że jeśli nie używasz licznika, możesz chcieć, aby kod został uruchomiony przynajmniej raz, nawet jeśli test jest prawdziwy. Tak jest w przypadku przykładowego skryptu poniżej. Więc w takich przypadkach chcesz użyć pętli Do-While . Składnia jest nieco inna.

do{
Your Steps
}while(Conditional Statement)

Korzystanie z nich nie jest tak oczywiste dla początkującego programisty. Wykonując typowe codzienne skrypty, możesz nie natknąć się na nie tak często. Szczególnie przydatne jest wykonanie prowizorycznego timera do testowania powodzenia procesu.

Windows nie uruchamia się w trybie awaryjnym

Zbudujemy szybki skrypt do ponownego uruchomienia zdalnej maszyny i zaalarmowania, jeśli nie pojawi się z powrotem w ciągu 15 minut. Ten scenariusz zakłada, że ​​jest to serwer domowy lub inna maszyna, która nie uruchamia się zbyt często. Możesz dostosować czas, jeśli Twój komputer zazwyczaj działa szybciej.

Uruchom ponownie i sprawdź: za pomocą pętli Do-While

Ten skrypt jest nieco prostszy. Najpierw używasz Restart komputera polecenie, aby ponownie uruchomić komputer zdalny. (Użyliśmy tutaj fałszywego adresu IP dla poleceń ponownego uruchomienia, pamiętaj, aby nadpisać go DNS/IP komputera). Następnie utwórz zmienną licznika, i i ustaw go na 0. Następnie masz pętlę Do z funkcją Start-Sleep, która zatrzymuje skrypt na 300 sekund (pięć minut). Drugie polecenie dodaje jeden do licznika.

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

Następnie mamy nasze kryteria While. Używamy testu Or, aby upewnić się, że awaria generuje alert. Alternatywą jest skrypt zapętlający się w nieskończoność czekając na zdalną maszynę. Aby sprawdzić maszynę, używamy Połączenie testowe polecenie cmdlet. Dla uproszczenia jest to Ping dla PowerShell. Dodajemy parametr -Cichy co zmusza go do zwrócenia True lub False zamiast wyników pakietów. Druga część instrukcji Or sprawdza, czy licznik jest większy niż trzy.

Gdy pętla się zakończy, chcemy utworzyć dane wyjściowe. Oznacza to, że musimy sprawdzić nasz licznik. To jest szybkie stwierdzenie if/else. Jeśli jest większa niż trzy, skrypt wyświetla informację, że maszyna zdalna nie odpowiada. Jeśli tak nie jest, oznacza to, że ponowne uruchomienie się powiodło.

Inne pętle

W PowerShell dostępne są dwa inne rodzaje pętli. Są one nieco związane z poprzednimi dwiema pętlami, po prostu nie są tak powszechnie używane. Pętla For działa podobnie do przykładu While. Ustawiasz wszystkie kryteria w ocenie, a następnie ustawiasz polecenia cmdlet.

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

Pętle Do Until są jak pętle Do While, wystarczy zmienić instrukcję While na Until. W przykładowym skrypcie byłoby to takie samo, jak zachowanie. Jest to wybór stylu, ale Do While jest bardziej wszechstronny w innych sytuacjach. Więc jeśli pamiętasz tylko jeden, Do While jest bardziej przydatny.

PowerShell ma również pomoc dla każdej z tych pętli. Możesz uzyskać pomoc, dodając o przed nazwą pętli w Get-Help. Możesz wtedy zobaczyć przykłady i inne wskazówki dla każdego typu. Powinny one być pomocne, jeśli utkniesz.

Dalszy rozwój z Tobą

W tym momencie masz już większość umiejętności, aby zacząć budować solidne skrypty. Niezależnie od tego, czy automatyzujesz sprzęt domowy, czy oszczędzasz czas w pracy, pętle pomagają skryptom robić więcej. Połączenie tych pętli z obsługą błędów przenosi skrypty poza podstawy. To otwiera drzwi do bardziej zaawansowanych języków.

Czym jest sprytny skrypt PowerShell, który utworzyłeś za pomocą pętli? Podziel się z nami w komentarzach.

Udział Udział Ćwierkać E-mail Usuń te pliki i foldery systemu Windows, aby zwolnić miejsce na dysku

Chcesz zwolnić miejsce na dysku na komputerze z systemem Windows? Oto pliki i foldery systemu Windows, które można bezpiecznie usunąć, aby zwolnić miejsce na dysku.

Czytaj dalej
Powiązane tematy
  • Programowanie
  • PowerShell
  • Skrypty
O autorze Michael McConnell(44 opublikowane artykuły)

Michael nie używał Maca, kiedy byli skazani, ale potrafi kodować w Applescript. Posiada stopnie naukowe z informatyki i języka angielskiego; od jakiegoś czasu pisze o Macu, iOS i grach wideo; i od ponad dziesięciu lat zajmuje się informatyką w ciągu dnia, specjalizując się w skryptach i wirtualizacji.

sposoby zarabiania pieniędzy grając w gry wideo
Więcej od Michaela McConnella

Zapisz się do naszego newslettera

Dołącz do naszego newslettera, aby otrzymywać porady techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!

Kliknij tutaj, aby zasubskrybować