about_Using
简短说明
允许指定要在会话中使用的命名空间。
长说明
using
语句允许指定要在会话中使用的命名空间。
添加命名空间可简化 .NET 类和成员的使用,并允许从脚本模块和程序集中导入类。
using
语句必须位于脚本或模块中的任何其他语句之前。 其前面不能有未注释的语句,包括参数。
using
语句不得包含任何变量。
using
语句与变量的 using:
范围修饰符不同。 有关详细信息,请参阅 about_Remote_Variables。
命名空间语法
若要解析 .NET 命名空间中的类型:
using namespace <.NET-namespace>
指定命名空间可以更轻松地按照短名称引用类型。
示例 - 为 typename 解析添加命名空间
以下脚本获取“Hello World”字符串的加密哈希。
请注意 using namespace System.Text
和 using namespace System.IO
如何简化对 System.Text
中的 [UnicodeEncoding]
以及 System.IO
中的 [Stream]
和 [MemoryStream]
的引用。
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
) 导入类和枚举。 它不会一致性地导入嵌套模块或点源到根模块的脚本中定义的类或枚举。 直接在根模块中定义你希望模块外部用户可以使用的类和枚举。
在脚本模块的开发过程中,通常更改代码,然后使用 Force 参数和 Import-Module
加载新版本的模块。 这仅适用于根模块中函数的更改。 Import-Module
不会重新加载任何嵌套模块。 此外,无法加载任何更新的类或枚举。
为确保运行最新版本,必须启动新会话。
无法卸载在 PowerShell 中定义并使用 using
语句导入的类和枚举。
示例 - 从脚本模块加载类
在此示例中,名为 CardGames 的 PowerShell 脚本模块定义了以下类:
- 幻灯片组
- 卡
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
cmdlet。
但是, Add-Type
cmdlet 会在执行时 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