about_Using

简短说明

允许指示会话中使用的命名空间。

长说明

语句 using 允许指定会话中使用的命名空间。 添加命名空间可简化 .NET 类和成员的使用,并允许从脚本模块和程序集导入类。

语句 using 必须先于脚本或模块中的任何其他语句。 任何未注释的语句都不能位于它前面,包括参数。

语句 using 不得包含任何变量。

语句 using 不应与变量的范围 using: 修饰符混淆。 有关详细信息,请参阅 about_Remote_Variables

命名空间语法

若要指定要从中解析类型的 .NET 命名空间,请执行以下操作:

using namespace <.NET-namespace>

指定命名空间可以更轻松地按短名称引用类型。

模块语法

若要从 PowerShell 模块加载类,请执行以下操作:

using module <module-name>

的值 <module-name> 可以是模块名称、完整模块规范或模块文件的路径。

<module-name> 是路径时,该路径可以是完全限定的,也可以是相对路径。 相对于包含 using 语句的脚本解析相对路径。

<module-name> 是名称或模块规范时,PowerShell 在 PSModulePath 中 搜索指定的模块。

模块规范是具有以下键的哈希表。

  • ModuleName - 必填 指定模块名称。
  • GUID - 指定模块的 GUID。
  • 还需要指定以下三个键之一。 这些密钥不能一起使用。
    • ModuleVersion - 指定模块的最低可接受版本。
    • RequiredVersion - 指定模块的确切所需版本。
    • MaximumVersion - 指定模块的最大可接受版本。

语句 using module 从根模块导入类, ModuleToProcess (脚本模块或二进制模块的) 。 它不会一致地将嵌套模块中定义的类或以点源的脚本中定义的类导入到模块中。 要在模块外部可供用户使用的类应在根模块中定义。

在脚本模块开发期间,通常会更改代码,然后使用 Force 参数加载新版本的模块Import-Module。 这仅适用于对根模块中函数的更改。 Import-Module 不会重新加载任何嵌套模块。 此外,无法加载任何更新的类。

若要确保运行最新版本,必须使用 cmdlet 卸载模块 Remove-ModuleRemove-Module 删除根模块、所有嵌套模块以及模块中定义的任何类。 然后,可以使用 和 语句重新加载模块和using moduleImport-Module

程序集语法

从 .NET 程序集预加载类型:

using assembly <.NET-assembly-path>

加载程序集会在分析时将 .NET 类型从该程序集预加载到脚本中。 这允许创建新的 PowerShell 类,这些类使用预加载程序集中的类型。

如果不创建新的 PowerShell 类,请改用 Add-Type cmdlet。 有关详细信息,请参阅 Add-Type

示例

示例 1 - 为 typename 解析添加命名空间

以下脚本获取“Hello World”字符串的加密哈希。

请注意 和 using namespace System.Textusing namespace System.IO 如何简化 中 System.Text[Stream] 中对 [MemoryStream] 和 的System.IO引用[UnicodeEncoding]

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)
$hashfromstream = Get-FileHash -InputStream $memorystream `
  -Algorithm $algorithm
$hashfromstream.Hash.ToString()

示例 2 - 从脚本模块加载类

在此示例中,我们有一个名为 CardGames 的 PowerShell 脚本模块,用于定义以下类:

  • CardGames.Deck
  • CardGames.Card

Import-Module#requires和 语句仅导入模块定义的模块函数、别名和变量。 不会导入类。 命令 using module 导入模块并加载类定义。

using module CardGames
using namespace CardGames

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

示例 3 - 从程序集加载类

此示例加载程序集,使其类可用于创建新的 PowerShell 类。 以下脚本创建派生自 DirectoryContext 类的新 PowerShell 类。

using assembly 'C:\Program Files\PowerShell\7\System.DirectoryServices.dll'
using namespace System.DirectoryServices.ActiveDirectory

class myDirectoryClass : System.DirectoryServices.ActiveDirectory.DirectoryContext
{

  [DirectoryContext]$domain

  myDirectoryClass([DirectoryContextType]$ctx) : base($ctx)
  {
    $this.domain = [DirectoryContext]::new([DirectoryContextType]$ctx)
  }

}

$myDomain = [myDirectoryClass]::new([DirectoryContextType]::Domain)
$myDomain
domain                                                    Name UserName ContextType
------                                                    ---- -------- -----------
System.DirectoryServices.ActiveDirectory.DirectoryContext                    Domain