about_Hash_Tables

Назначение: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

РАЗДЕЛ

about_Hash_Tables

КРАТКОЕ ОПИСАНИЕ

Содержит описание того, как создавать, использовать и сортировать хэш-таблицы в Windows PowerShell®.

ПОДРОБНОЕ ОПИСАНИЕ

Хэш-таблица, также называемая словарем или массивом ассоциативных элементов, представляет собой компактную структуру данных, в которой хранится одна или несколько пар «имя-значение». Например, хэш-таблица может содержать набор IP-адресов и имен компьютеров, причем IP-адреса являются ключами, а имена компьютеров — значениями или наоборот.

В Windows PowerShell каждая хэш-таблица представляет собой объект Hashtable (System.Collections.Hashtable). Вы можете использовать свойства и методы объектов Hashtable в Windows PowerShell.

Начиная с версии Windows PowerShell 3.0 можно использовать атрибут [ordered] для создания упорядоченного словаря (System.Collections.Specialized.OrderedDictionary) в Windows PowerShell.

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

Ключи и значения в хэш-таблицах также являются объектами .NET. Чаще всего они являются строками или целыми числами, но могут иметь любой тип объекта. Также можно создавать вложенные хэш-таблицы, в которых значение ключа является другой хэш-таблицей.

Хэш-таблицы используются довольно часто, потому что они позволяют эффективно находить и извлекать данные. В Windows PowerShell с помощью хэш-таблиц можно хранить списки или создавать вычисляемые свойства. Кроме того, в Windows PowerShell есть командлет ConvertFrom-StringData, который преобразует строки в хэш-таблицу.

Синтаксис

Хэш-таблица имеет следующий синтаксис:

          @{ <name> = <value>; [<name> = <value> ] ...}

Упорядоченный словарь имеет следующий синтаксис:

          [ordered]@{ <name> = <value>; [<name> = <value> ] ...}

Атрибут [ordered] появился в Windows PowerShell 3.0.

Создание хэш-таблиц

При создании хэш-таблицы необходимо соблюдать приведенные ниже правила.

– Начинайте хэш-таблицу со знака «@».

– Заключайте хэш-таблицу в фигурные скобки ({}).

– В качестве содержимого хэш-таблицы введите одну или несколько пар «ключ-значение».

– Используйте знак «равно» (=) для отделения ключа от значения.

– Для разделения пар «ключ-значение» используйте точку с запятой (;).

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

– Для управления хэш-таблицей сохраните ее в переменной.

– При присвоении упорядоченный хэш-таблицы переменной поместите атрибут [ordered] перед символом «@». Если поместить его перед именем переменной, команда завершится ошибкой.

Чтобы создать пустую хэш-таблицу в значении переменной $hash, введите следующую команду:

          $hash = @{}

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

          $hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}

Создание упорядоченных словарей

Упорядоченный словарь можно создать путем добавления объекта типа OrderedDictiory, но самым простым способом создания упорядоченного словаря является использование атрибута [Ordered].

Атрибут [ordered] появился в Windows PowerShell 3.0.

Поместите атрибут непосредственно перед символом «@».

          $hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}

Упорядоченные словари можно использовать так же, как хэш-таблицы. И тех, и других можно использовать в качестве значений параметров, которые принимают хэш-таблицы или словари (iDictionary).

Атрибут [ordered] нельзя использовать для преобразования или приведения хэш-таблицы. Если поместить атрибут [ordered] перед именем переменной, команда завершится сбоем и появится приведенное ниже сообщение об ошибке.

        PS C:\> [ordered]$hash = @{}
        At line:1 char:1
        + [ordered]$hash = @{}
        + ~~~~~~~~~~~~~~
        The ordered attribute can be specified only on a hash literal node.
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : OrderedAttributeOnlyOnHashLiteralNode
    To correct the expression, move the [ordered] attribute.     
        PS C:\> $hash = [ordered]@{}

Упорядоченный словарь можно привести к хэш-таблице, но восстановить атрибут ordered нельзя, даже если очистить переменную и ввести новые значения. Чтобы восстановить порядок, нужно удалить и повторно создать переменную.

        PS C:\> [hashtable]$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
        PS C:\ps-test> $hash

        Name                           Value
        ----                           -----
        Color                          Blue
        Shape                          Square
        Number                         1

Отображение хэш-таблиц

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

          C:\PS> $hash
        
          Name                           Value
          ----                           -----
          Shape                          Square
          Color                          Blue
          Number                         1

Хэш-таблицы имеют свойства Keys и Values. Для отображения всех ключей или всех значений используйте точечную нотацию.

          C:\PS> $hash.keys
          Number
          Shape
          Color
        
          C:\PS> $hash.values
          1
          Square
          Blue
         

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

          $hashtable.<key>
          <value>     

Например:

          C:\PS> $hash.Number
          1

          C:\PS> $hash.Color
          Blue

Хэш-таблицы имеют свойство Count, которое указывает количество пар «ключ-значение» в хэш-таблице.

          C:\PS> $hash.count
          3

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

Например:

          C:\PS> $hash["Number"]
          1

Добавление и удаление ключей и значений

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

          $hash["<key>"] = "<value>"

Например, чтобы добавить ключ «Time» со значением «Now» в хэш-таблицу, используйте приведенный ниже формат оператора.

          $hash["Time"] = "Now"

Ключи и значения можно также добавлять в хэш-таблицу с помощью метода Add объекта System.Collections.Hashtable. Метод Add имеет следующий синтаксис:

          Add(Key, Value)

Например, чтобы добавить ключ «Time» со значением «Now» в хэш-таблицу, используйте приведенный ниже формат оператора.

          $hash = $hash.Add("Time", "Now")

Кроме того, ключи и значения можно добавлять в хэш-таблицу с помощью оператора сложения (+), который добавляет хэш-таблицу в существующую хэш-таблицу. Например, приведенный ниже оператор добавляет ключ «Time» со значением «Now» в хэш-таблицу в переменной $hash.

          $hash = $hash + @{Time="Now"}

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

          $t = "Today"
          $now = (Get-Date)
          
          $hash.Add($t, $now)      

Для удаления пары «ключ-значение» из хэш-таблицы нельзя использовать оператор вычитания, но можно использовать метод Remove объекта Hashtable. Метод Remove принимает ключ в качестве значения.

Метод Remove имеет следующий синтаксис:

          Remove(Key)          

Например, чтобы удалить пару «ключ-значение» Time=Now из хэш-таблицы в значении переменной $hash, введите следующую команду:

          $hash.$Remove("Time")

Вы можете использовать все свойства и методы объектов Hashtable в Windows PowerShell, включая Contains, Clear, Clone и CopyTo. Подробнее об объектах Hashtable см. в разделе «System.Collections.Hashtable» на сайте MSDN.

Типы объектов в хэш-таблицах

Ключи и значения в хэш-таблице могут иметь любой тип объекта .NET. Хэш-таблица может содержать ключи и значения разных типов.

Приведенный ниже оператор создает хэш-таблицу, содержащую строки имен процессов и значения объектов процессов, и сохраняет ее в переменной $p.

          $p = @{"PowerShell" = (get-process PowerShell); 
          "Notepad" = (get-process notepad)}

Вы можете отобразить хэш-таблицу, хранящуюся в переменной $p, и использовать свойства key-name для отображения значений.

          C:\PS> $p

          Name                           Value
          ----                           -----
          PowerShell                     System.Diagnostics.Process (PowerShell)
          Notepad                        System.Diagnostics.Process (notepad)
          C:\PS> $p.PowerShell        
      
          Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
          -------  ------    -----      ----- -----   ------     -- -----------
              441      24    54196      54012   571     5.10   1788 PowerShell
          C:\PS> $p.keys | foreach {$p.$_.handles}
          441
          251

Ключи в хэш-таблице также могут быть любого типа .NET. Приведенный ниже оператор добавляет пару «ключ-значение» в хэш-таблицу в переменной $p. Ключ является объектом Service, представляющим службу WinRM, а значение представляет текущее состояние службы.

           C:\PS> $p = $p + @{(Get-Service WinRM) = ((Get-Service WinRM).Status)}

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

           C:\PS> $p

           Name                           Value
           ----                           -----
           PowerShell                     System.Diagnostics.Process (PowerShell)
           Notepad                        System.Diagnostics.Process (notepad)
           System.ServiceProcess.Servi... Running

       
           C:\PS> $p.keys
           PowerShell
           Notepad

           Status   Name               DisplayName
           ------   ----               -----------
           Running  winrm              Windows Remote Management (WS-Manag...

            
           C:\PS> $p.keys | foreach {$_.name}
           winrm        

Ключи и значения в хэш-таблице также могут быть объектами Hashtable. Приведенный ниже оператор добавляет пару «ключ-значение» в хэш-таблицу в переменной $p. В этой паре ключ представляет собой строку Hash2, а значение — хэш-таблицу с тремя парами «ключ-значение».

          C:\PS> $p = $p + @{"Hash2"= @{a=1; b=2; c=3}}

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

          C:\PS> $p


          Name                           Value
          ----                           -----
          PowerShell                     System.Diagnostics.Process (PowerShell)
          Notepad                        System.Diagnostics.Process (notepad)
          System.ServiceProcess.Servi... Running
          Hash2                          {a, b, c}


          C:\PS> $p.Hash2

          Name                           Value
          ----                           -----
          a                              1
          b                              2
          c                              3


          C:\PS> $p.Hash2.b
          2
     

Сортировка ключей и значений

По своей природе элементы в хэш-таблице не упорядочены. Каждый раз при отображении пар «ключ-значение» они могут представать в другом порядке.

Хотя отсортировать хэш-таблицу нельзя, с помощью метода GetEnumerator хэш-таблицы можно перечислить ключи и значения, а затем использовать командлет Sort-Object для сортировки отображаемых перечисленных значений.

Например, приведенные ниже команды перечисляют ключи и значения в хэш-таблице, хранящейся в переменной $p, а затем сортируют ключи в алфавитном порядке.

          C:\PS> $p.GetEnumerator() | Sort-Object -Property key

          Name                           Value
          ----                           -----
          Notepad                        System.Diagnostics.Process (notepad)
          PowerShell                     System.Diagnostics.Process (PowerShell)
          System.ServiceProcess.Servi... Running

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

          C:\PS> $p.getenumerator() | Sort-Object -Property Value -Descending

          Name                           Value
          ----                           -----
          PowerShell                     System.Diagnostics.Process (PowerShell)
          Notepad                        System.Diagnostics.Process (notepad)
          System.ServiceProcess.Servi... Running

Создание объектов на основе хэш-таблиц

Начиная с версии Windows PowerShell 3.0 можно создать объект на основе хэш-таблицы, содержащей свойства и их значения.

Синтаксис выглядит следующим образом:

        [<class-name>]@{<property-name>=<property-value>;<property-name>=<property-value>}

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

Подробнее см. в разделе about_Object_Creation.

ConvertFrom-StringData

Командлет ConvertFrom-StringData преобразует строку или here-строку, содержащую пары «ключ-значение», в хэш-таблицу. Командлет ConvertFrom-StringData можно безопасно использовать в разделе Data сценария, либо его можно использовать с командлетом Import-LocalizedData для вывода сообщений с применением языка и региональных параметров пользовательского интерфейса текущего пользователя.

Here-строки особенно удобно использовать в случаях, когда значения в хэш-таблице включают кавычки. (Подробнее о here-строках см. в разделе about_Quoting_Rules.)

В примере ниже показано, как создать here-строку из пользовательских сообщений из предыдущего примера и с помощью командлета ConvertFrom-StringData преобразовать эту строку в хэш-таблицу.

Приведенная ниже команда создает here-строку из пар «ключ-значение», а затем сохраняет ее в переменной $string.

          C:\PS> $string = @"
          Msg1 = Type "Windows".
          Msg2 = She said, "Hello, World."
          Msg3 = Enter an alias (or "nickname").
          "@

Эта команда использует командлет ConvertFrom-StringData, чтобы преобразовать here-строку в хэш-таблицу.

        C:\PS> ConvertFrom-StringData $string

        Name                           Value
        ----                           -----
        Msg3                           Enter an alias (or "nickname").
        Msg2                           She said, "Hello, World."
        Msg1                           Type "Windows".

Дополнительные сведения о here-строках см. в разделе about_Quoting_Rules.

СМ. ТАКЖЕ

about_Arrays

about_Object_Creation

about_Quoting_Rules

about_Script_Internationalization

ConvertFrom-StringData

Import-LocalizedData

«System.Collections.Hashtable» на сайте MSDN