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

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

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





не могу войти в icloud на Mac

Вы можете создать существующие команды, которые используете каждый день, внутри циклов, чтобы сэкономить время и силы. Ваши скрипты делают тяжелую работу, в то время как вы делаете важную работу по чтению дополнительных статей о 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 чтобы получить все файлы в папке Documents. Переменная окружения $ env: ПРОФИЛЬ ПОЛЬЗОВАТЕЛЯ запускает скрипт с использованием текущего профиля. Эта переменная более переносима, чем жестко заданный путь. Результаты этого поиска присваиваются переменной $ 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'
}

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

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

Другие петли

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

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

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

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

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

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

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

Делиться Делиться Твитнуть Эл. адрес Удалите эти файлы и папки Windows, чтобы освободить место на диске

Вам нужно очистить дисковое пространство на вашем компьютере с Windows? Вот файлы и папки Windows, которые можно безопасно удалить, чтобы освободить место на диске.

Читать далее
Похожие темы
  • Программирование
  • PowerShell
  • Сценарии
Об авторе Майкл МакКоннелл(Опубликовано 44 статей)

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

как найти владельца международного номера телефона
Ещё от Michael McConnell

Подписывайтесь на нашу новостную рассылку

Подпишитесь на нашу рассылку технических советов, обзоров, бесплатных электронных книг и эксклюзивных предложений!

Нажмите здесь, чтобы подписаться