Как работят Powershell Foreach, While и други цикли

Как работят Powershell Foreach, While и други цикли

Важна първа стъпка в изучаването на програмирането е работата с цикли. За щастие, PowerShell продължава да расте с вашите умения.





как да създадете валиден имейл адрес

Можете да рамкирате съществуващите команди, които използвате всеки ден в цикли, за да спестите време и усилия. Вашите скриптове вършат тежката работа, докато вършите важната работа, като прочетете повече статии за MakeUseOf!





Powershell ForEach Loops: Вратата към усъвършенствана обработка на данни

ForEach е псевдоним за ForEach-Object. (Псевдонимът е просто пряк път за команда в PowerShell.) Това е подходящ момент да поговорим за начина, по който PowerShell борави с данни.





Подобно на повечето съвременни езици за програмиране, PowerShell е обектно-ориентиран. Всичко в PowerShell е обект, което означава, че дори променливите имат разширени свойства и функции . Това свойство е причината да можете да настроите търсенията си на променлива и в крайна сметка да получите масив от резултатите.

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

На някои езици обработката на този масив би била многоетапен процес. Първо, получаване на дължината и след това броене на всяка стъпка.



В PowerShell преминавате през масива и изпълнявате действието върху всеки от тях с помощта на ForEach. Това ви спестява няколко реда код, което е полезно, ако имате по -дълъг скрипт. Например, по -долу е малък скрипт, който би използвал няколко цикъла на Powershell ForEach. Той създава ZIP архив на всички ваши файлове, които не сте отваряли за 30 дни.

Изграждане на система за файлови архиви с помощта на ForEach цикли

Нека счупим стъпките надолу. Ти използваш Get-ChildItem за да получите всички файлове в папката Документи. Променливата на средата $ env: USERPROFILE изпълнява скрипта, използвайки текущия профил. Тази променлива е по -преносима от твърдо кодиран път. Резултатите от това търсене се приписват на променливата $ MyDocs . След това създаваме нашия цикъл ForEach, като го пресичаме през всеки $ Doc в $ 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
}

Вътре в цикъла проверяваме дали всеки файл е LastAccessTime имотът е по -стар от 30 дни. Получаваме това с Get-Date cmdlet и с помощта на AddDays функция с минус тридесет. Ако е така, добавяме файла към $ myOldDocs масив. След като сортирането на файлове приключи, ние вземаме нашия завършен масив и създаваме zip файл. Този процес е малко по -сложен, тъй като включва извикване на малко .NET. Не се притеснявайте, ако не го разбирате напълно - можете да откраднете кода този помощен документ на TechNet .

За да разберете какво се случва тук: Ще преместим всичките си стари файлове в нова директория, наречена за днешната дата за по -стари от 30 дни. След като тази папка се изгради, трябва да създадем ZIP архива със същото име. Ще тестваме, за да се уверим, че архивът е успешен и .ZIP файлът е там, след което изтриваме новата папка. Задайте това като планирана задача, която да се изпълнява веднъж месечно. Ще спестите малко място и ще поддържате папката си Документи чиста.





While и Do While: Цикли при условие

Ако искате да изпълните цикъл само когато е изпълнено определено условие, използвате цикъл While. Ако използвате променлива за проследяване на броенето, задайте първо това.

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

Проблемът е, че ако не използвате брояч, може да искате кодът ви да се изпълни поне веднъж, дори ако тестът е верен. Такъв е случаят с примерния скрипт по -долу. Така че в тези случаи искате да използвате Do-While цикъл. Синтаксисът е малко по -различен.

do{
Your Steps
}while(Conditional Statement)

Използването им не е толкова очевидно за начинаещия програмист. Правейки типични ежедневни скриптове, може да не се сблъскате с тях толкова често. Когато те са особено полезни, е да се направи импровизиран таймер за тестване на успеха на процеса.

приставка за adobe flash player за mac

Ще създадем бърз скрипт за рестартиране на отдалечена машина и предупреждение, ако не се върне в рамките на 15 минути. Този сценарий предполага, че това е домашен сървър или друга машина, която не се рестартира много често. Не се колебайте да регулирате времето, ако компютърът ви обикновено се появява по -бързо.

Рестартиране и проверка: Използване на Do-While Loop

Този скрипт е малко по -прост. Първо, използвате Рестартирайте компютъра команда за рестартиране на отдалечената машина. (Използвахме фиктивен IP тук за командите за рестартиране, не забравяйте да го презапишете с DNS/IP на вашия компютър). След това създайте променливата брояч, i и го задайте на 0. След това имате Do цикъл с Start-Sleep, който спира скрипта за 300 секунди (пет минути). Втора команда добавя една към брояча.

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

Тогава имаме нашите критерии While. Използваме тест Or, за да гарантираме, че грешката генерира предупреждение. Алтернативата е скриптът да циклира безкрайно в очакване на отдалечената машина. За да проверим за машината, използваме Тестова връзка cmdlet. За простота, това е Ping за PowerShell. Добавяме параметъра -Тихо което го принуждава да връща True или False, а не резултатите от пакетите. Втората част на оператора Or проверява дали броячът е повече от три.

След като цикълът завърши, искаме да създадем изхода. Това означава, че трябва да проверим брояча си. Това е бързо изявление if/else. Ако е по -голямо от три, скриптът извежда, че отдалечената машина не реагира. Ако не е, то извежда, че рестартирането е било успешно.

Други цикли

В PowerShell има два други вида контури. Те са донякъде свързани с предишните две контури, просто не са толкова често използвани. Цикълът For работи подобно на примера While. Вие задавате всичките си критерии в оценката, след което задавате своите командлети.

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

Циклите Do Do са като цикли Do While, просто променяте оператора While на До. В примерния скрипт това би било същото като поведението. Това е избор на стил, но Do While е по -универсален в други ситуации. Така че, ако си спомняте само едно, Do While е по -полезно.

PowerShell също има помощ за всеки от тези цикли. Можете да получите помощ, като добавите относно преди името на цикъла в Get-Help. След това можете да видите примери и други съвети за всеки тип. Те трябва да са полезни, ако се забиете.

Продължавайки да растем с вас

На този етап имате повечето умения да започнете да изграждате здрави скриптове. Независимо дали автоматизирате домашната си платформа или спестявате време на работа, циклите помагат на вашите скриптове да направят повече. Комбинирането на тези цикли с обработка на грешки премества скриптовете ви извън основите. Това отваря вратата към по -напредналите езици.

Какво е умен скрипт PowerShell, който сте създали с помощта на цикли? Споделете го с нас в коментарите.

Дял Дял Туит електронна поща Изтрийте тези файлове и папки на Windows, за да освободите дисково пространство

Трябва да изчистите дисковото пространство на вашия компютър с Windows? Ето файловете и папките на Windows, които могат безопасно да бъдат изтрити, за да се освободи място на диска.

Прочетете Напред
Свързани теми
  • Програмиране
  • PowerShell
  • Скриптове
За автора Майкъл Макконъл(44 статии са публикувани)

Майкъл не е използвал Mac, когато са били обречени, но може да кодира в Applescript. Има дипломи по компютърни науки и английски език; той пише за Mac, iOS и видео игри от известно време; и той е дневна IT маймуна повече от десетилетие, специализиран в скриптове и виртуализация.

Google Play Магазин на Amazon Fire
Още от Майкъл Макконъл

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, рецензии, безплатни електронни книги и изключителни оферти!

Щракнете тук, за да се абонирате