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

Для поиска файлов через Powershell есть командлет ChildItem. С помощью него мы можем фильтровать данные. Например так мы выведем все файлы и папки, которые лежат на диске C.

Поиск файлов через Powershell по дате

Теперь попробуем найти файлы, которые были созданы за последнюю неделю. Для этого, сначала, объявим переменную с датой:

Не обязательно все заполнять, но в таком случае значения будут приняты по умолчанию (от текущего дня).

Затем передадим эти значения в наш поиск:

  • | это конвейер или Pipline, он говорит о том, что к каждому объекту слева нужно применить действия справа
  • Where-Object <$_.LastWriteTime — говорит о том, что нужно применять только к тем объектам, где есть значение LastWriteTime (последнее время изменения).
  • -ge $date — значит, что объект должен быть больше или равен (Greater than or equal) нашей переменной с датой. Если бы мы хотели узнать до определенной даты, мы должны были бы указать -le $date, -eq если бы дата была бы ровна. Называется "Операторы сравнения"

DateTime: The truth is out there…

Так, у меня есть 30 дней для оплаты штрафа. А какое сегодня число? Ой, а месяц-то какой? Кажется февраль… А год не високосный ли?

Да, наплевать! Есть же (Get-Date).AddDays (30) !! Далее небольшая история и много примеров работы с классом [DateTime], которые вам обязательно пригодятся, раз вы сюда попали

Когда я только начинал изучать PowerShell, я увидел много интересных и непонятных вещей, но именно класс [DateTime] был самым непонятным, поэтому я долго пытался обходить его стороной. Наверное, это связано с тем, что для написания PowerShell скриптов какое-то время совсем необязательно знать что такое методы и функции, но [DateTime] просто заставляет в это погрузиться и оказывается, все не так сложно…

Языки программирования, которые я поверхностно изучал в институте, вероятно, позволяли пользоваться какими-то методами, создавать классы и т.д., но, вероятно, для этого нужно было написать очень много строк кода, и я не представлял, что когда-нибудь я смогу создавать небольшие программы без всяких компиляторов, студий и т.д. так просто, что даже для простых задач, выполняемых мышкой, стало проще написать скрипт, чем действительно делать их мышкой. Я думаю, что любую сущность надо прочувствовать. Я написал уже несколько десятков скриптов для ActiveDirectory, прежде чем смог сказать, что я знаю, что такое ActiveDirectory ???? В книгах и статьях можно найти разные объяснения про объекты, их свойства и методы. Что-то вроде следующего: Есть дом — это объект, у него есть длина, ширина, высота — это свойства. У него есть и метод — звонок, нажми на звонок, и из дома вылетит… Как-то не складно… Так вот чтобы почувствовать что PowerShell — это ООП, почувствовать его мощь и попробовать понять что это такое и зачем это нужно в скриптовом языке, давайте обратимся за помощью к классу [DateTime] В PowerShell есть много типов данных, проверить тип данных какого-то конкретного экземпляра можно с помощью метода GetType. Создадим переменную $Date и присвоим ей значение — текущую дату:

$Date = Get-Date

Убедимся что переменная $Date теперь представляет собой экземпляр класса [DateTime]

PS> $() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True DateTime PS>

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

ForEach — это псевдоним ForEach-Object. (Псевдоним — это просто ярлык для команды в PowerShell.) Сейчас самое время поговорить о том, как PowerShell обрабатывает данные.

Как и большинство современных языков программирования, PowerShell является объектно-ориентированным

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

, Именно из-за этого свойства вы можете задать поиск по переменной и в итоге получить массив результатов.

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

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

В PowerShell вы проходите массив и выполняете действие для каждого из них, используя ForEach. Это сэкономит вам несколько строк кода, что полезно, если у вас есть более длинный скрипт. Например, ниже приведен небольшой скрипт, который будет использовать пару циклов Powershell ForEach. Он создает ZIP-архив всех ваших файлов, которые вы не открыли в течение 30 дней.

Как разрешить выполнение неподписанного скрипта PowerShell?

1. В оболочке PowerShell, перед тем как запускать скрипт, выполнить команду, разрешающую выполнение неподписанных скриптов для текущего сеанса оболочки:

Set-ExecutionPolicy RemoteSigned -Scope Process

2. При запуске из стандартной коммандной строки использовать параметр -executionpolicy, т.е. запускать скрипт так:

powershell -executionpolicy RemoteSigned -file <имя_скрипта>

Оба способа устанавливают политику только для текущего сеанса, при этом, политика безопасности выполнения скриптов PowerShell, прописанная в реестре, не будет изменена и останется прежней. Если вы хотите поменять политику безопасности выполнения скриптов «на постоянно», то используйте такой способ:

3. Разрешить запуск навсегда: запустить оболочку PowerShell от имени «Администратора», затем выполните команду:

Set-ExecutionPolicy RemoteSigned

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

Примечание: Если скрипт был загружен из интернета, то чтобы избежать запроса на подтверждение запуска, нужно вместо RemoteSigned использовать Bypass — полное отключение любых запросов и предупреждений.

Инициализация многомерного массива

$array = @(1, 2, 3), @(4, 5, 6), @(7, 8, 9) $array[0] # 1 $array[0][0] # 1 $array[2][2] # 9 Что ещё

Дополнения к вышеописанным объектам существуют ещё объекты ArrayList, OrderedDictionary, PSObject, которые могут быть полезны вам для хранения и обработки значений. Возможно в дальнейшем я опишу их в отдельной статье. И расскажу про отличия от массивов и хеш-таблиц. Но пока я этого не сделал, то настоятельно рекомендую Вам самостоятельно поискать в Интернет информацию о PSObject. Это мощное средство, которое в чём-то похоже на Hashtable, при этом обладает большей производительностью.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Понравилась статья? Поделиться с друзьями:
Adblock
detector