РАЗДЕЛ about_Functions КРАТКОЕ ОПИСАНИЕ Описывает, как создавать и использовать функции в Windows PowerShell. ПОЛНОЕ ОПИСАНИЕ Функция представляет собой список инструкций и имеет имя, выбираемое пользователем. Для выполнения функции вводится ее имя. Инструкции в списке выполняются так, как если бы они были введены в командную строку. Как и у командлетов, у функций могут быть параметры. Это могут быть именованные, позиционные и динамические параметры, а также параметры-переключатели. Параметры функций могут считываться из командной строки или из конвейера. Функции могут возвращать значения, которые затем могут отображаться, присваиваться переменным или передаваться другим функциям и командлетам. Список инструкций функции может содержать списки инструкций различных типов с ключевыми словами Begin, Process и End. Эти списки инструкций по-разному обрабатывают поступающий через конвейер ввод. Фильтр представляет собой функцию особого типа, использующую ключевое слово Filter. Функции могут также выступать в роли командлетов. Можно создать функцию, которая работает как командлет, без программирования на языке C#. Дополнительные сведения см. в разделе about_Functions_Ad vanced. Синтаксис Ниже показан синтаксис функции: function [<область:>]<имя> [([тип]$parameter1[,[тип]$parameter2])] { param([тип]$parameter1 [,[тип]$parameter2]) dynamicparam {<список_инструкций>} begin {<список_инструкций>} process {<список_инструкций>} end {<список_инструкций>} } Функция включает один из следующих элементов: - ключевое слово Function; - область (необязательно); - выбранное пользователем имя; - произвольное число именованных параметров (необязательно); - одну или несколько команд Windows PowerShell, заключенных в фигурные скобки ({}). Дополнительные сведения о ключевом слове Dynamicparam и динамических параметрах в функциях см. в разделе about_Functions_Advanced_Parameters. Простые функции Чтобы функции были полезными, они не обязательно должны быть сложными. Показанная ниже функция получает переменные среды, которые не относятся к учетной записи System текущей системы: function other_env { get-wmiObject win32_environment | where {$_.username -ne "<System>"} } Чтобы выполнить эту функцию, введите "other_env". Можно создать набор из небольших полезных функций и добавить эти функции в профиль Windows PowerShell, как описано в разделе about_Profiles и далее в этом разделе. Функции с параметрами С функциями можно использовать параметры, в том числе именованные, позиционные и динамические параметры, а также параметры- переключатели. Дополнительные сведения о динамических параметрах в функциях см. в разделе about_Functions_Advanced_Parameters. Именованные параметры Можно определить произвольное число именованных параметров. Для именованных параметров можно задать значение по умолчанию, как показано далее в этом разделе. Параметры можно определить внутри фигурных скобок, используя ключевое слово Param, как показано в следующем примере. function <name> { param ([type]$parameter1[,[type]$parameter2]) <statement list> } Кроме того, параметры можно определять вне фигурных скобок без ключевого слова Param, как показано в следующем примере. function <имя> [([тип]$parameter1[,[тип]$parameter2])] { <список_инструкций> } Эти два подхода абсолютно равноправны. Можно использовать любой предпочтительный подход. При выполнении функции значение, заданное в качестве параметра, присваивается переменной, которая содержит имя параметра. Значение этой переменной можно использовать в функции. Ниже приведен пример функции с именем Small_files. У этой функции имеется параметр $size. Функция отображает все файлы, размер которых меньше значения параметра, и исключает каталоги. function small_files { param ($size) Get-ChildItem c:\ | where { $_.length -lt $size -and !$_.PSIsContainer} } В этой функции можно использовать переменную $size, которая представляет собой имя, определенное для параметра. Чтобы использовать эту функцию, введите следующую команду: C:\PS> function small_files -size 50 Кроме того, значение именованного параметра можно задать без указания имени параметра. Например, результат выполнения следующей команды не отличается от результата выполнения команды с именем параметра size: C:\PS> function small_files 50 Чтобы задать для параметра значение по умолчанию, после имени параметра введите знак равенства и значение, как показано в следующей версии функции Small_files: function small_files ($size = 100) { Get-ChildItem c:\ | where { $_.length -lt $size -and !$_.PSIsContainer} } Если ввести имя функции "small_files" без значения, то переменной $size будет присвоено значение 100. Если указать значение, функция будет использовать это значение. Позиционные параметры Позиционный параметр - это параметр без имени. Чтобы связать значение параметра с параметром в функции, в Windows PowerShell используется порядок следования значений параметров. При использовании позиционных параметров необходимо ввести одно или несколько значений после имени функции. Значения позиционных параметров присваиваются массиву $args. Значение, указанное непосредственно после имени функции, присваивается первому элементу массива $args ($args[0]). Приведенная ниже функция Extension добавляет к задаваемому имени файла расширение ".txt": function extension { $name = $args[0] + ".txt" $name } C:\PS> extension myTextFile myTextFile.txt Функция может принимать несколько позиционных параметров. В следующем примере отображаются все значения, введенные после имени функции. function repeat { foreach ($arg in $args) { "The input is $arg" } } C:\PS>repeat one The input is one C:\PS> repeat one two three The input is one The input is two The input is three Эту функцию можно использовать с произвольным числом значений. Данная функция присваивает каждое значение элементу массива $args. Параметры-переключатели Переключатель - это параметр, которому не требуется значение. Имя параметра-переключателя просто указывается после имени функции. Чтобы определить параметр-переключатель, укажите перед именем параметра тип [switch], как показано в следующем примере: function switchExample { param ([switch]$on) if ($on) { "Switch on" } else { "Switch off" } } Если после имени функции ввести параметр-переключатель On, функция выведет текст "Switch on". Без параметра-переключателя будет выведен текст "Switch off". C:\PS> SwitchExample -on Switch on C:\PS> SwitchExample Switch off Кроме того, при выполнении функции можно присвоить переключателю логическое значение, как показано в следующем примере: C:\PS> SwitchExample -on:$true Switch on C:\PS> SwitchExample -on:$false Switch off Передача объектов в функции по конвейеру Все функции могут принимать входные данные с помощью конвейера. Управление обработкой поступающих через конвейер входных данных осуществляется в функции с помощью ключевых слов Begin, Process и End. В следующем примере показаны три ключевых слова: function <имя> { begin {<список_инструкций>} process {<список_инструкций>} end {<список_инструкций>} } Список инструкций Begin выполняется только один раз в начале функции. Список инструкций Process выполняется по одному разу для каждого из объектов в конвейере. Пока выполняется блок Process, каждый объект из конвейера присваивается автоматической переменной $_, по одному объекту за раз. После того как функция получит все объекты в конвейере, один раз выполняется список инструкций из блока End. Если ключевые слова Begin, Process и End не используются, все инструкции выполняются так, как если бы они находились в блоке End. В следующей функции используется ключевое слово Process. Функция отображает примеры из конвейера: function pipelineFunction { process {"The value is: $_"} } Чтобы продемонстрировать эту функцию, введите массив разделенных запятыми чисел, как показано в следующем примере: C:\PS> 1,2,4 | pipelineFunction The value is: 1 The value is: 2 The value is: 4 При использовании функции в конвейере направляемые в функцию объекты присваиваются автоматической переменной $input. Функция выполняет инструкции с ключевым словом Begin, прежде чем будут получены объекты из конвейера. Функция выполняет инструкции в блоке End после получения из конвейера всех объектов. В следующем примере показано использование автоматической переменной $input с ключевыми словами Begin и End. function PipelineBeginEnd { begin {"Begin: The input is $input"} end {"End: The input is $input" } } Если выполнить эту функцию с использованием конвейера, будут выведены следующие результаты: C:\PS> 1,2,4 | PipelineBeginEnd Begin: The input is End: The input is 1 2 4 Когда выполняется инструкция Begin, у функции еще нет входных данных из конвейера. Инструкция End выполняется после получения значений функцией. Если функция содержит ключевое слово Process, то она считывает данные в переменную $input. Ниже показан пример списка инструкций Process: function PipelineInput { process {"Processing: $_ " } end {"End: The input is: $input" } } В этом примере каждый объект, направляемый в функцию по конвейеру, передается в список инструкций Process. Инструкции в блоке Process выполняются для каждого объекта по очереди. Когда функция достигает ключевого слова End, автоматическая переменная $input пуста. C:\PS> 1,2,4 | PipelineInput Processing: 1 Processing: 2 Processing: 4 End: The input is: Фильтры Фильтр - этот тип функции, которая выполняется для каждого объекта в конвейере. Фильтр напоминает функцию, все инструкции которой находятся в блоке Process. Синтаксис фильтра имеет следующий вид: filter [<область:>]<имя> {<список_инструкций>} Следующий фильтр принимает из конвейера записи журнала и отображает либо всю запись, либо только сообщение из записи: filter ErrorLog ([switch]$message) { if ($message) { out-host -inputobject $_.Message } else { $_ } } Область функции Функция существует в пределах области, в которой она была создана. Если функция является частью скрипта, эта функция доступна в инструкциях в этом скрипте. По умолчанию функции в скрипте не доступны в командной строке. Область функции можно задать. Например, в следующем примере функция добавляется в глобальную область: function global:get-dependentsvs { get-service | where {$_.dependentservices} } Если функция принадлежит к глобальной области, ее можно использовать в скриптах, в функциях и в командной строке. Обычно функции образуют собственную область. Элементы, создаваемые внутри функции, например переменные, существуют только в пределах области этой функции. Дополнительные сведения об областях в Windows PowerShell см в разделе about_Scope. Поиск функций и управление ими с помощью диска Function: Все функции и фильтры в Windows PowerShell автоматически сохраняются на диске Function:. Этот диск предоставляется поставщиком функций Windows PowerShell. При обращении к диску Function: необходимо ставить двоеточие после слова Function, как это происходит при обращении к диску C или D компьютера. Следующая команда отображает все функции в текущем сеансе Windows PowerShell: C:\PS> dir function: Команды в функции хранятся в виде блока скрипта в свойстве definition функции. Например, чтобы отобразить команды в функции Help, входящей в состав Windows PowerShell, введите: (dir function:help).definition Дополнительные сведения о диске Function: см. в разделе Function. Повторное использование функций в новых сеансах При вводе функции в командной строке Windows PowerShell функция становится частью текущего сеанса. Она доступна до завершения сеанса. Чтобы использовать функцию во всех сеансах Windows PowerShell, добавьте функцию в профиль Windows PowerShell. Дополнительные сведения о профилях см. в разделе about_Profiles. Кроме того, функцию можно сохранить в файле скрипта Windows PowerShell. Введите функцию в текстовый файл и сохраните файл с расширением PS1. Создание справки для функций Командлет Get-Help возвращает справку для функций, а также для командлетов, поставщиков и скриптов. Чтобы получить справку для функции, введите командлет Get-Help и имя функции. Например, чтобы получить справку для функции MyDisks, введите: get-help MyDisks Имеется два способа написания справки для функции. -- Справка для функции на основе комментариев Темы справки создаются посредством использования в комментариях специальных ключевых слов. Чтобы создать для функции справку на основе комментариев, комментарии необходимо поместить в начало или конец тела функции или в строки, предшествующие ключевому слову function. Дополнительные сведения о справке на основе комментариев см. в разделе about_Comment_Based_Help. -- Справка для функции на основе XML Создайте раздел справки XML подобно тому, как это делается для командлетов. Справка на основе XML нужна в том случае, если разделы справки локализуются для различных языков. Чтобы связать функцию с разделом справки XML, воспользуйтесь ключевым словом комментариев справки .ExternalHelp. Дополнительные сведения о ключевом слове ExternalHelp см. в разделе about_Comment_Based_Help. Дополнительные сведения о справке на основе XML см. в разделе "How to Write Cmdlet Help" (Как писать справку для командлетов) в библиотеке MSDN. СМ. ТАКЖЕ about_Automatic_Variables about_Comment_Based_Help about_Functions_Advanced about_Functions_CmdletBindingAttribute about_Parameters about_Profiles about_Scopes about_Script_Blocks Function (поставщик)