Как работает Powershell Foreach, while и другие циклы

Важным первым шагом в обучении программированию является работа с циклами

, К счастью, PowerShell продолжает расти вместе с вашими навыками.

Вы можете создавать существующие команды, которые вы используете каждый день, внутри циклов, чтобы сэкономить время и усилия. Ваши сценарии выполняют тяжелую работу, в то время как вы выполняете важную работу — читаете больше статей на MakeUseOf!

Петли Powershell ForEach: дверь в расширенную обработку данных

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 командлет, и используя AddDays функция с отрицательным тридцать. Если это так, мы добавляем файл в $ myOldDocs массив. После того, как сортировка файлов завершена, мы берем наш законченный массив и создаем zip-файл. Этот процесс немного сложнее, так как включает в себя активацию .NET. Не беспокойтесь, если вы не совсем поняли — вы можете украсть код из этого справочного документа TechNet.

Чтобы разобраться в том, что здесь происходит: мы переместим все наши старые файлы в новый каталог с сегодняшней датой старше 30 дней. Как только эта папка будет создана, нам нужно создать ZIP-архив с тем же именем. Мы протестируем, чтобы убедиться, что архив успешно завершен, и в нем есть файл .ZIP, а затем удалим новую папку. Установите это как запланированное задание для запуска один раз в месяц. Вы сэкономите немного места и сохраните папку «Документы» в чистоте.

Пока и Делай Пока: Циклы при условии

Если вы хотите запустить цикл только при соблюдении определенного условия, используйте цикл While. Если вы используете переменную для отслеживания счета, сначала установите ее.

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

Проблема в том, что если вы не используете счетчик, вы можете захотеть, чтобы ваш код запускался хотя бы один раз, даже если тест верен. Это случай с примером сценария ниже. Таким образом, в этих случаях вы хотите использовать цикл Do-While

, Синтаксис немного отличается.

do{
Your Steps
}while(Conditional Statement)

Их использование не так очевидно для начинающего программиста. Делая типичные сценарии изо дня в день, вы не можете столкнуться с ними так часто. Что им особенно пригодится, так это создание временного таймера для проверки успешности процесса.

Мы собираемся создать быстрый сценарий для перезагрузки удаленного компьютера и оповещения, если он не возвращается в течение 15 минут. В этом сценарии предполагается, что это домашний сервер или другой компьютер, который не очень часто перезагружается. Не стесняйтесь настраивать время, если ваш компьютер обычно загружается быстрее.

Перезагрузка и проверка: использование цикла Do-While

Этот скрипт немного проще. Во-первых, вы используете Перезапустить компьютер Команда перезагрузить удаленную машину. (Мы использовали фиктивный IP здесь для команд перезагрузки, не забудьте перезаписать его DNS / IP вашего компьютера). Затем создайте переменную счетчика, я и установите его на 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"
}

Тогда у нас есть наши критерии. Мы используем тест Or, чтобы убедиться, что сбой генерирует предупреждение. Альтернативой является скрипт, бесконечно зацикливающийся на ожидании удаленного компьютера. Чтобы проверить машину, мы используем Тест-соединение Командлет. Для простоты это Ping для PowerShell. Добавляем параметр -Тихо что заставляет его возвращать True или False, а не результаты пакетов. Вторая часть оператора Or проверяет, больше ли счетчик, чем три.

После завершения цикла мы хотим создать вывод. Это означает, что нам нужно проверить наш счетчик. Это быстрый оператор if / else. Если оно больше трех, скрипт выводит, что удаленная машина не отвечает. Если это не так, выводится, что перезагрузка прошла успешно.

Другие петли

В PowerShell доступны два других типа циклов. Они в некоторой степени связаны с предыдущими двумя циклами, они просто не так часто используются. Цикл For работает аналогично примеру While. Вы устанавливаете все свои критерии в оценке, а затем устанавливаете свои командлеты.

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

Циклы «До» похожи на циклы «До тех пор», вы просто изменяете оператор «Пока» на «До». В примере сценария это будет то же самое, что и поведение. Это выбор стиля, но Do While более универсален в других ситуациях. Так что, если вы помните только один, «Делай пока» более полезен.

петли forex

PowerShell также имеет помощь для каждого из этих циклов. Вы можете получить помощь, добавив около перед именем цикла в Get-Help. Затем вы можете увидеть примеры и другие советы для каждого типа. Это должно быть полезно, если вы застряли.

Продолжая расти вместе с тобой

На данный момент у вас есть большинство навыков, чтобы начать создавать надежные сценарии. Будь автоматизировать свою домашнюю установку

или экономя время на работе, циклы помогают вашим сценариям делать больше. Объединение этих циклов с обработкой ошибок выводит ваш сценарий за рамки

, Это открывает дверь в более продвинутые языки.

Что за умный сценарий PowerShell вы создали с помощью циклов? Поделитесь этим с нами в комментариях.

Ссылка на основную публикацию
Adblock
detector