РАЗДЕЛ
    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 (поставщик)




Содержание