Поделиться через


about_Using

Краткое описание

Позволяет указать пространства имен для использования в сеансе.

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

Инструкция using позволяет указать пространства имен для использования в сеансе. Добавление пространств имен упрощает использование классов и членов .NET и позволяет импортировать классы из модулей скриптов и сборок.

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

Инструкция using не должна содержать переменные.

Оператор using отличается от модификатора using: область для переменных. Дополнительные сведения см. в разделе about_Remote_Variables.

Синтаксис пространства имен

Чтобы разрешить типы из пространства имен .NET, выполните следующие действия.

using namespace <.NET-namespace>

Указание пространства имен упрощает ссылки на типы по их коротким именам.

Пример. Добавление пространств имен для разрешения имени типа

Следующий скрипт получает криптографический хэш для строки "Hello World".

Обратите внимание на using namespace System.Text то, как и using namespace System.IO упростить ссылки в [UnicodeEncoding]System.Text и [MemoryStream][Stream] в System.IO.

using namespace System.Text
using namespace System.IO

[string]$string = "Hello World"
## Valid values are "SHA1", "SHA256", "SHA384", "SHA512", "MD5"
[string]$algorithm = "SHA256"

[byte[]]$stringBytes = [UnicodeEncoding]::Unicode.GetBytes($string)

[Stream]$memoryStream = [MemoryStream]::new($stringBytes)
$getFileHashSplat = @{
    InputStream = $memoryStream
    Algorithm   = $algorithm
}
$hashFromStream = Get-FileHash @getFileHashSplat
$hashFromStream.Hash.ToString()

Синтаксис модуля

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

using module <module-name>

Значение <module-name> может быть именем модуля, полной спецификацией модуля или путем к файлу модуля.

Если <module-name> является путем, путь может быть полным или относительным. Относительный путь разрешается относительно скрипта, в котором using есть оператор .

Если <module-name> является спецификацией имени или модуля, PowerShell выполняет поиск указанного модуля в PSModulePath .

Спецификация модуля — это хэш-таблице со следующими ключами.

  • ModuleName - Обязательно Указывает имя модуля.
  • GUID - Дополнительные Указывает GUID модуля.
  • Кроме того, необходимо указать по крайней мере один из трех приведенных ниже ключей.
    • ModuleVersion — задает минимальную допустимую версию модуля.
    • MaximumVersion — задает максимально допустимую версию модуля.
    • RequiredVersion — указывает точную требуемую версию модуля. Его нельзя использовать с другими ключами версии.

Import-Module#requires и инструкция импортирует только функции, псевдонимы и переменные модуля, как определено модулем. Классы и перечисления не импортируются.

Оператор using module импортирует классы и перечисления из корневого модуля (ModuleToProcess) модуля скрипта или двоичного модуля. Он не выполняет согласованного импорта классов или перечислений, определенных во вложенных модулях или скриптах, которые находятся в корневом модуле. Определите классы и перечисления, которые должны быть доступны пользователям за пределами модуля непосредственно в корневом модуле.

Во время разработки модуля скрипта обычно вносятся изменения в код, а затем загружают новую версию модуля с помощью Import-Module параметра Force . Это работает только для изменений функций в корневом модуле. Import-Module не перезагружает вложенные модули. Кроме того, невозможно загрузить обновленные классы или перечисления.

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

Пример. Загрузка классов из модуля скрипта

В этом примере модуль скрипта PowerShell с именем CardGames определяет следующие классы:

  • Презентация
  • Карточка

Import-Module#requires и инструкция импортирует только функции, псевдонимы и переменные модуля, как определено модулем. Классы не импортируются. Команда using module импортирует модуль, а также загружает определения классов.

using module CardGames

[Deck]$deck = [Deck]::new()
$deck.Shuffle()
[Card[]]$hand1 = $deck.Deal(5)
[Card[]]$hand2 = $deck.Deal(5)
[Card[]]$hand3 = $deck.Deal(5)

Синтаксис сборки

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

using assembly <.NET-assembly-path>

Инструкция using assembly аналогична использованию командлета Add-Type . Add-Type Однако командлет добавляет тип во время Add-Type выполнения, а не в начале выполнения скрипта. Дополнительные сведения см. в разделе Add-Type.

Пример. Загрузка типов из сборки

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

using assembly './YamlDotNet.dll'
using namespace YamlDotNet

$yamlSerializer = [Serialization.Serializer]::new()

$info = [ordered]@{
  Inventory = @(
    @{ Name = 'Apples' ; Count = 1234 }
    @{ Name = 'Bagels' ; Count = 5678 }
  )
  CheckedAt = [datetime]'2023-01-01T01:01:01'
}

$yamlSerializer.Serialize($info)
Inventory:
- Name: Apples
  Count: 1234
- Name: Bagels
  Count: 5678
CheckedAt: 2023-01-01T01:01:01.0000000