About_functions

Подробное описание

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

Ключевое слово Ссылка
about_Functions, about_Functions_Advanced
about_Break, about_Trap
about_Try_Catch_Finally
about_Classes
about_Continue, about_Trap
about_Data_Sections
Зарезервировано для использования в будущем.
about_Do, about_While
about_Functions_Advanced_Parameters
about_If
about_If
about_Functions, about_Functions_Advanced_Methods
about_Enum
about_Functions
about_Try_Catch_Finally
about_For
about_ForEach
Зарезервировано для использования в будущем.
about_Functions, about_Functions_Advanced
about_Hidden
about_If
about_ForEach
about_Functions
about_Functions, about_Functions_Advanced
about_Return
about_Classes
about_Switch
about_Throw, about_Functions_Advanced_Methods
about_Trap, about_Break, about_Try_Catch_Finally
about_Try_Catch_Finally
about_Do
about_Using, about_Classes
Зарезервировано для использования в будущем.
about_While, about_Do

Рабочие процессы PowerShell используют следующие ключевые слова:

Рабочие процессы PowerShell поддерживаются только в PowerShell 5.1. Дополнительные сведения о рабочих процессах см. в разделе «Выполнение команд PowerShell в рабочем процессе».

Отличия командлетов от команд

Командлеты отличаются от команд в других средах командной оболочки следующими способами.

  • Командлеты являются экземплярами классов .NET; они не являются изолированными исполняемыми файлами.
  • Командлеты можно создавать с помощью нескольких десятков строк кода.
  • Командлеты обычно не выполняют собственный синтаксический анализ, представление ошибок или форматирование выходных данных. Синтаксический анализ, представление ошибок и форматирование вывода обрабатываются средой выполнения PowerShell.
  • Командлеты обрабатывают входные объекты из конвейера, а не из потоков текста, а командлеты обычно доставляют объекты в конвейер в качестве выходных данных.
  • Командлеты ориентированы на записи, так как они обрабатывают один объект за раз.

Добавление в массивы

На этом этапе вас начинает интересовать, как добавить элементы в массив. Собственно говоря, никак. Массив имеет фиксированный размер в памяти. Если необходимо увеличить массив или добавить в него один элемент, то в этом случае необходимо создать новый массив и скопировать в него все значения из старого. На первый взгляд это требует значительных усилий, однако PowerShell значительно упрощает создание нового массива. В PowerShell реализован оператор сложения () для массивов.

Примечание

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

Сложение массивов

Для создания нового массива можно использовать оператор сложения. Итак, дано два массива:

Мы можем сложить их вместе, чтобы получить новый массив.

Плюс равно (+=)

Мы можем создать новый массив и добавить в него элемент следующим образом:

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

Назначение конвейера

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

Обычно если мы говорим об использовании конвейера, мы подразумеваем типичные однострочные сценарии PowerShell. Можно использовать конвейер с операторами и другими циклами. Таким образом, вместо добавления элементов в массив в цикле можно поместить элементы в конвейер.

Другие особенности

Итак, мы рассмотрели все основные функции, и вот еще кое-что, о чем я хотел рассказать, прежде чем мы закончим.

Массивы с предварительно заданным размером

Я уже говорил, что вы не сможете изменить размер массива после того, как он создан. Можно создать массив с предварительно заданным размером, вызвав его с помощью конструктора .

Инициализация с нулевыми значениями

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

Для этого также можно использовать умножение.

Особенно полезно в умножении то, что можно использовать любое значение. Поэтому если планируется по умолчанию использовать значение , это будет хорошим вариантом.

Вложенные массивы

Массив внутри массива называется вложенным массивом. Я не использую их в PowerShell, но часто использовал в других языках. Использовать массив массивов рекомендуется, если данные вписываются в шаблон типа сетки.

Существует два способа создания двумерного массива.

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

В случае с многомерным массивом все иначе.

Для вложенного массива нотация индексов имеет некоторые изменения. Мы получаем значение 3, используя выше.

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

Write-Output -NoEnumerate

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

Обычно я передаю объекты в , чтобы получить дополнительные сведения о них. Когда я передаю туда массив, выполняется его разворачивание, и Get-Member видит элементы массива, а не фактический массив.

Чтобы запретить разворачивание массива, можно использовать .

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

Возврат массива

Такое разворачивание массивов также выполняется при выводе или возврате значений из функции. Для получения массива по-прежнему можно присвоить выходные данные переменной, что обычно не вызывает проблем.

Хитрость в том, что создается новый массив. Если это проблематично, можно решить проблему с помощью или .

Запуск заданий на основе потоков и управление ими

Существует два способа запуска заданий на основе потоков:

  • — из модуля ThreadJob .
  • — в PowerShell 7.0 добавлена параллельная функция.

Используйте те же командлеты заданий , которые описаны в about_Jobs для управления заданиями на основе потоков.

Использование

Модуль ThreadJob впервые поставляется с PowerShell 6. Его также можно установить из коллекция PowerShell для Windows PowerShell 5.1.

Чтобы запустить задание потока на локальном компьютере, используйте командлет с командой или сценарием, заключенными в фигурные скобки ().

В следующем примере запускается задание потока, выполняющее команду на локальном компьютере.

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

Использование

PowerShell 7.0 добавил новый набор параметров в командлет. Новые параметры позволяют запускать блоки скриптов в параллельных потоках в качестве заданий PowerShell.

Данные можно передать в . Данные передаются в блок скрипта, который выполняется параллельно. Параметр создает объекты заданий для каждого из параллельных потоков.

Следующая команда запускает задание, содержащее дочерние задания для каждого входного значения, переданного в команду. Каждое дочернее задание выполняет команду с входным значением по конвейеру в качестве аргумента.

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

Типы массивов

По умолчанию массив в PowerShell создается как тип . Благодаря этому он может содержать любые типы объектов и значений. Это возможно, поскольку все наследуется из типа .

Строго типизированные массивы

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

ArrayList

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

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

Мы создаем и добавляем в него элементы следующим образом.

Для получения этого типа вызывается .NET. В этом случае для его создания используется конструктор по умолчанию. Затем вызывается метод , чтобы добавить в него элемент.

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

Если единственными данными в массиве являются строки, ознакомьтесь также с использованием StringBuilder. Это практически то же самое, но некоторые методы предназначены только для работы со строками. специально предназначен для повышения производительности.

Обычно пользователи переходят на с массивов. Однако это наследие тех времен, когда в C# еще не была предусмотрена универсальная поддержка. От отказываются в пользу универсального

Универсальный список

Универсальный тип — это особый тип в C#, который определяет обобщенный класс, при этом пользователь указывает типы данных, которые используются в процессе создания. Поэтому если требуется список чисел или строк, необходимо определить, что требуется список типов или .

Список для строк создается следующим образом.

Так же создается список чисел.

Можно привести существующий массив к списку следующим образом, не создавая сначала объект:

Синтаксис можно сократить с помощью оператора в PowerShell 5 и более поздних версиях. Оператор должен быть первой строкой сценария. Объявляя пространство имен, PowerShell позволяет исключить из него типы данных при ссылке на них.

Это позволяет сделать гораздо более удобным.

Вам доступен аналогичный метод . В отличие от ArrayList метод не возвращает значение, поэтому для него не нужно выполнять .

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

List

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

Remove()

Как , так и универсальные поддерживают удаление элементов из коллекции.

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

Метод Remove возвращает , если удалось найти и удалить элемент из коллекции.

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

Передача аргументов в команды PowerShell

Начиная с PowerShell 3.0, можно использовать маркер конца параметров (), чтобы остановить интерпретацию входных данных в PowerShell в качестве параметров PowerShell. Это соглашение, указанное в спецификации оболочки POSIX и служебных программ.

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

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

Это поведение применяется только к командам PowerShell. Если вы используете маркер при вызове внешней команды, строка передается в качестве аргумента этой команде.

Выходные данные показывают, что передается в качестве аргумента .

Ожидание завершения и получения результатов задания

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

Следующая команда запускает задание потока, которое выполняет команду, а затем ожидает завершения команды и, наконец, возвращает все результаты данных, созданные командой.

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

Командлет возвращает результаты дочерних заданий.

Так как каждое дочернее задание выполняется параллельно, порядок созданных результатов не гарантируется.

Командлеты

Командлеты выполняют действие и обычно возвращают объект Microsoft .NET в следующую команду в конвейере. Командлет — это одна команда, которая участвует в семантике конвейера PowerShell.
Сюда входят двоичные командлеты (C#), расширенные функции скриптов, CDXML и рабочие процессы.

В этой документации по пакету SDK описывается создание двоичных командлетов, написанных на языке C#. Дополнительные сведения о командлетах на основе сценариев см. в следующих статьях:

  • about_Functions_Advanced
  • about_Functions_CmdletBindingAttribute
  • about_Functions_Advanced_Methods

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

  • Объявите атрибут, который идентифицирует производный класс в качестве командлета.
  • Определите открытые свойства, снабженные атрибутами, которые определяют открытые свойства в качестве параметров командлета.
  • Переопределите один или несколько методов обработки ввода для обработки записей.

Сборку, содержащую класс, можно загрузить напрямую с помощью командлета Import-Module . также можно создать ведущее приложение, которое загружает сборку с помощью API System. Management. Automation. пространства выполнения. Initialsessionstate. Оба метода предоставляют программный и доступ командной строки к функциональности командлета.

Оператор switch

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

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

Присвоение значения переменной

Этот последний пример можно написать иначе.

Мы помещаем значение в конвейер PowerShell и присваиваем его . Это же действие можно выполнить с помощью инструкций и .

По умолчанию

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

Здесь по умолчанию возвращается значение .

строк

Я в этих последних примерах сопоставлял числа, но вы также можете сопоставлять строки.

Я решил не заключать здесь совпадения с , и в кавычки, подчеркнув тем самым тот факт, что они необязательны. В большинстве случаев обрабатывает их как строку.

Тестирование командлета

после регистрации командлета в Windows PowerShell протестируйте его, запустив в командной строке. Например, протестируйте код для примера командлета. Дополнительные сведения об использовании командлетов из командной строки см. в Начало работы с Windows PowerShell.

  • в командной строке Windows PowerShell введите следующие команды, чтобы получить имена процессов через конвейер.

    Появится следующий результат.

  • Введите следующие строки, чтобы получить объекты процесса со свойством из процессов с именем «iexplore». в этом примере используется командлет (предоставленный Windows PowerShell) в качестве вышестоящей команды для получения процессов «IEXPLORE».

    Появится следующий результат.

Командлеты PowerShell

В состав PowerShell входят сотни предустановленных команд. Команды PowerShell называются командлетами. Слово cmdlet произносится как командлет.

Имя каждого командлета состоит из пары глагол-существительное. Например, . Такое соглашение об именовании облегчает понимание назначения командлета. Оно также упрощает поиск нужной команды. При поиске необходимого командлета можно выполнять фильтрацию по глаголу или существительному.

Использование командлетов для изучения PowerShell

Первое знакомство с PowerShell может показаться пугающим, так как кажется, что предстоит очень многому научиться.
Изучение PowerShell происходит постепенно и по мере необходимости.

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

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

С помощью этих команд можно узнать о PowerShell практически все, что нужно.

Команда

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

В качестве выходных данных будет выведен длинный список глаголов. Следует отметить, что в ответе приводится дополнительный контекст о действии, выполняемом глаголом. Вот как выглядит первая строка выходных данных:

Другие особенности

Итак, мы рассмотрели все основные функции, и вот еще кое-что, о чем я хотел рассказать, прежде чем мы закончим.

Массивы с предварительно заданным размером

Я уже говорил, что вы не сможете изменить размер массива после того, как он создан. Можно создать массив с предварительно заданным размером, вызвав его с помощью конструктора .

Инициализация с нулевыми значениями

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

Для этого также можно использовать умножение.

Особенно полезно в умножении то, что можно использовать любое значение. Поэтому если планируется по умолчанию использовать значение , это будет хорошим вариантом.

Вложенные массивы

Массив внутри массива называется вложенным массивом. Я не использую их в PowerShell, но часто использовал в других языках. Использовать массив массивов рекомендуется, если данные вписываются в шаблон типа сетки.

Существует два способа создания двумерного массива.

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

В случае с многомерным массивом все иначе.

Для вложенного массива нотация индексов имеет некоторые изменения. Мы получаем значение 3, используя выше.

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

Write-Output -NoEnumerate

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

Обычно я передаю объекты в , чтобы получить дополнительные сведения о них. Когда я передаю туда массив, выполняется его разворачивание, и Get-Member видит элементы массива, а не фактический массив.

Чтобы запретить разворачивание массива, можно использовать .

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

Возврат массива

Такое разворачивание массивов также выполняется при выводе или возврате значений из функции. Для получения массива по-прежнему можно присвоить выходные данные переменной, что обычно не вызывает проблем.

Хитрость в том, что создается новый массив. Если это проблематично, можно решить проблему с помощью или .

Использование конвейеров

Большинство командлетов PowerShell предназначены для поддержки конвейеров. В большинстве случаев результаты командлета Get можно передать другому командлету того же существительного.
Например, можно передать выходные данные командлета в командлеты или командлеты.

В этом примере конвейер запускает службу WMI на компьютере:

В другом примере можно передать выходные данные поставщика реестра PowerShell или в командлет. В этом примере добавляется новая запись реестра NoOfEmployees со значением 8124 в раздел реестра MyCompany .

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

Объекты можно передать в командлеты форматирования, экспорта и вывода, такие как , , , и .

В этом примере показано, как использовать командлет для отображения списка свойств объекта процесса.

Выходные данные собственных команд также можно передать в командлеты PowerShell. Пример:

Важно!

Потоки успешности и ошибок похожи на потоки stdin и stderr других оболочк. Однако stdin не подключен к конвейеру PowerShell для ввода. Дополнительные сведения см. в about_Redirection.

В некоторой практике вы обнаружите, что объединение простых команд в конвейеры экономит время и ввод, а также делает скрипт более эффективным.

Подробное описание

PowerShell параллельно выполняет команды и скрипты с помощью заданий. PowerShell предоставляет три типа заданий для поддержки параллелизма.

  • — команды и скрипты выполняются в удаленном сеансе. Дополнительные сведения см. в разделе about_Remote_Jobs.
  • — команды и скрипты выполняются в отдельном процессе на локальном компьютере. См. дополнительные сведения о заданиях.
  • или — команды и скрипты выполняются в отдельном потоке в рамках одного процесса на локальном компьютере.

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

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

Важно!

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

Существует два способа обойти эту ситуацию:

  1. Используется для создания заданий, выполняемых в отключенных сеансах. Дополнительные сведения см. в разделе about_Remote_Jobs.
  2. Используется для создания нового процесса, а не задания. Дополнительные сведения см. в разделе «Начало процесса».

Добавление в массивы

На этом этапе вас начинает интересовать, как добавить элементы в массив. Собственно говоря, никак. Массив имеет фиксированный размер в памяти. Если необходимо увеличить массив или добавить в него один элемент, то в этом случае необходимо создать новый массив и скопировать в него все значения из старого. На первый взгляд это требует значительных усилий, однако PowerShell значительно упрощает создание нового массива. В PowerShell реализован оператор сложения () для массивов.

Примечание

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

Сложение массивов

Для создания нового массива можно использовать оператор сложения. Итак, дано два массива:

Мы можем сложить их вместе, чтобы получить новый массив.

Плюс равно (+=)

Мы можем создать новый массив и добавить в него элемент следующим образом:

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

Назначение конвейера

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

Обычно если мы говорим об использовании конвейера, мы подразумеваем типичные однострочные сценарии PowerShell. Можно использовать конвейер с операторами и другими циклами. Таким образом, вместо добавления элементов в массив в цикле можно поместить элементы в конвейер.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Работатека
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: