当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 了解 PowerShell 数据类型和加速器

作者:精品下载站 日期:2024-12-14 13:02:16 浏览:14 分类:玩电脑

了解 PowerShell 数据类型和加速器


与许多其他语言一样,PowerShell 几乎所有事情都使用对象。 PowerShell 具有数据类型,可以使用不同的属性和方法架构对对象类型进行“分类”。

一旦您了解了 PowerShell 数据类型,您很快就会发现 PowerShell 类型加速器这一概念具有节省时间的能力。加速器是在 PowerShell 中加速分配数据类型的方法。

在本文中,您将了解各种对象数据类型以及如何使用加速器来更轻松地使用它们。

类型加速器示例

即使您以前没有听说过加速器,您也很可能在编码时使用过它们。使用PowerShell获取类型你会发现,[Array][Bool][String]都是类型加速器。这些类加速器提供的是快速访问较长的 .NET 定义。

  • [数组][System.Array]
  • [CmdletBinding][System.Management.Automation.CmdletBindingAttribute]

我们如何了解在 PowerShell 中使用加速器的选项?继续阅读以了解有关类型加速器的所有信息!

通过获取类型加速器发现 PowerShell 数据类型

PowerShell 提供了一个单行命令,该命令将返回 PowerShell 已知的每种类型的加速器。例如,PowerShell 7 环境中可用的类型加速器如下。

[PSObject].Assembly.GetType("System.Management.Automation.TypeAccelerators")::Get
Key                          Value
---                          -----
Alias                        System.Management.Automation.AliasAttribute
AllowEmptyCollection         System.Management.Automation.AllowEmptyCollectionAttribute
AllowEmptyString             System.Management.Automation.AllowEmptyStringAttribute
AllowNull                    System.Management.Automation.AllowNullAttribute
ArgumentCompleter            System.Management.Automation.ArgumentCompleterAttribute
ArgumentCompletions          System.Management.Automation.ArgumentCompletionsAttribute
<SNIP>

了解如何使用每个加速器是完全不同的任务。为此,您需要了解给定加速器的构造函数。使用 GetConstructors 方法,我们可以发现构造函数所需的参数。

首先,我们检索 URI 加速器以了解有六种不同的类型。输出可能并不总是清楚要使用哪个值 - 如果是这样,阅读 Microsoft 参考文档通常会阐明如何使用该类。

( [Type]"URI" ).GetConstructors() | ForEach-Object {
	( $_.GetParameters() | ForEach-Object { $_.ToString() } ) -Join ", "
}

[玩转系统] 了解 PowerShell 数据类型和加速器

PowerShell 数据类型加速器

有了查找 PowerShell 数据类型加速器以及它们可能使用的构造函数的能力,让我们深入了解如何使用最常见的加速器!

统一资源标识符

URL(统一资源定位符)和 URI(统一资源标识符)可能很难操作。很多时候,唯一的办法是使用字符串操作来提取所需的值。 .NET 为这些场合提供了 URI 类型加速器。

下面的示例演示了将简单的 URL 传递到 URI 加速器。输出是 URI 的组成部分,使操作更加快捷。

[URI]"https://google.com/"

[玩转系统] 了解 PowerShell 数据类型和加速器

一旦您有了 URI 对象,就可以使用一些简单的方法来进一步使用,如下面的 Get-Member 输出所示。

$URI = [URI]"https://google.com/"
$URI | Get-Member -Type Method

[玩转系统] 了解 PowerShell 数据类型和加速器

WMI、WMI 搜索器、WMI 类

许多长期使用 PowerShell 的管理员都熟悉 WMI 或 Windows Management Instrumentation。许多 Windows 设置存在于 WMI 框架内。那么我们可以使用 WMIWMISearcherWMIClass 加速器做什么呢?

  • WMIClass - 访问类的静态属性和方法。
  • WMISearcher - 创建 WMI 对象搜索。
  • WMI - 检索类的单个实例。

下面演示的代码使用所有三种方法来创建 notepad.exe 进程、找到该进程,然后检索进一步的进程详细信息。

# Create notepad.exe Process
$ProcessManager = [WMICLASS]"root\cimv2:WIn32_Process"
$ProcessManager.Create("notepad.exe")

# Locate the notepad.exe process
$Search = [WmiSearcher]'SELECT * FROM Win32_Process'
$Processes = $Search.Get()
$Process = $Processes | Where-Object Name -Match "Notepad"

# Use WMI accelerator to retrieve the notepad.exe process
$WMIProcess = [WMI]("\.\root\cimv2:Win32_Process.Handle='{0}'" -F $Process.ProcessId)

XML

处理 XML 文档是一项挑战。 XML 提供了一种灵活但冗长的格式。对于任何语言来说,尝试解析长而复杂的文档都是困难的。 PowerShell 使用 PowerShell 数据类型加速器 XML 使这一切变得更加容易。使用 Get-Content 从字符串或文件中使用 XML 文档。

$XML = [XML]"<note>
	<to>Joe</to>
	<from>Ashley</from>
	<heading>Reminder</heading>
	<body>Don't forget Bob's birthday this weekend!</body>
</note>"

$XML.Note.Body

[玩转系统] 了解 PowerShell 数据类型和加速器

您可以看到如何轻松地浏览节点以查找特定值。例如,假设我们不需要 heading 子节点。使用 SelectNodes 方法可以轻松执行 XPath 搜索。使用 SelectSingleNode 定位单个节点,然后使用 RemoveChild 方法删除该节点。

$XPath = '/note'
$Nodes = $XML.SelectNodes($XPath )
$Nodes | ForEach-Object {
  $Node = $_.SelectSingleNode('heading')
  $_.RemoveChild($Node) | Out-Null
}

[玩转系统] 了解 PowerShell 数据类型和加速器

正则表达式

正则表达式使文本内容中的复杂搜索变得更加容易。构建这些查询本身就是一个挑战。设计出完美的查询后,您可以使用 PowerShell RegEx 加速器对文本内容执行快速匹配。

虽然从技术上讲不是 PowerShell 数据类型,但正则表达式类型加速器仍然可以极大地减少执行正则表达式匹配的次数。

下面是一个简单的RegEx匹配方法。制作一个简单的正则表达式并对文本字符串调用 Match 方法来执行搜索。

([RegEx]'\d{8}').Match('This will find the first 8 values, like 12345678').Value

[玩转系统] 了解 PowerShell 数据类型和加速器

约会时间

PowerShell 的一个共同点是需要处理脚本中的日期。操纵日期和时间的方法有很多。一种简单的方法(有许多有用的方法)是使用 PowerShell 数据类型 [DateTime] 加速器。一些更有用的技术是:

  • 解析日期时间字符串
  • 设置日期时间格式
  • 日期时间算术运算

解析日期时间字符串

给定已知的日期格式(即不是自定义格式),DateTime 加速器将返回一个有效的 System.DateTime 对象,该对象与使用时的对象类型相同Get-Date 函数。

[DateTime]::Parse('2020-08-10')

[玩转系统] 了解 PowerShell 数据类型和加速器

设置日期时间格式

数据文件通常需要独特格式的日期时间字符串。例如,我们采用之前创建的相同日期并调用 ToString 方法。对于此方法,我们将传递自定义日期格式 MM_dd_yyyy-hh:mm:ss。请注意,这不是典型的格式,但使用 ToString 方法,我们将以这种格式正确输出日期。

([DateTime]::Parse('2020-08-10')).ToString('MM_dd_yyyy-hh:mm:ss')

[玩转系统] 了解 PowerShell 数据类型和加速器

日期时间算术运算

从现有 datetime 对象中添加和减去时间至关重要。不要使用复杂的解决方法,而是利用 DateTime 类来执行这些操作。

([DateTime]::Parse('2020-08-10')).AddDays(5)
(([DateTime]::Parse('2020-08-10')).AddDays(5)).AddMonths(-2)

[玩转系统] 了解 PowerShell 数据类型和加速器

添加 5 天后,我们还需要删除两个月。尽管使用了 AddMonths 方法,但传递负值会减去时间。使用括号进行链接操作,我们最终得到了期望的结果。

时间跨度

DateTime 类非常相似,TimeSpan 类使处理时间范围变得容易。与 DateTime 不同,可以使用额外的数学运算,例如除法和乘法。

创建时间跨度对象

您可以通过多种方式构建时间跨度值。在我们的示例中,我们使用小时、分钟、秒构造函数。其他可能的构造函数如下所示。

  • 蜱虫
  • 小时、分钟、秒
  • 天、小时、分钟、秒
  • 天、小时、分钟、秒、毫秒
$TimeSpan = [TimeSpan]::New(1,0,0)
$TimeSpan

[玩转系统] 了解 PowerShell 数据类型和加速器

时间跨度上的乘法和除法

假设您已经定义了给定的时间跨度,但您想知道该范围的三倍是多少。使用Multiply方法可以很简单地做到这一点。

$TimeSpan.Multiply(3)

[玩转系统] 了解 PowerShell 数据类型和加速器

那么分裂呢?我们如何将给定的时间间隔分成四分之一?我们可以使用 Divide 方法来查找时间跨度的四分之一值。

$TimeSpan.Divide(4)

[玩转系统] 了解 PowerShell 数据类型和加速器

IP地址

IP 地址管理和验证都是一件苦差事。 IPAddress 加速器提供验证 IPv4 和 IPv6 地址的功能。

[IPAddress]"10.0.0.1"

[玩转系统] 了解 PowerShell 数据类型和加速器

正如您所看到的,这是一个有效的 IP 地址,但如果我们不确定一个值是否是正确的地址怎么办?传递格式错误或超出范围的地址将导致错误通知不正确的值。

[IPAddress]"258.0.0.1"

[玩转系统] 了解 PowerShell 数据类型和加速器

PS凭证

保护凭据对于与 Web 服务、远程系统或第三方应用程序交互至关重要。 PSCredential 类将密码加密到对象中。将此对象传递到函数和 cmdlet 中可以使身份验证变得容易。

在下面的示例中,我们将创建一个用于存储安全值的 PSCredential 对象。请注意,密码值需要安全字符串。

[PSCredential]::New("username", ("password" | ConvertTo-SecureString -AsPlainText -Force))

[玩转系统] 了解 PowerShell 数据类型和加速器

虽然我们看到这里输出的用户名值,但我们看不到密码值。我们如何检索它?

$Credential = [PSCredential]::New("username", ("password" | ConvertTo-SecureString -AsPlainText -Force))
$Credential | Format-List

[玩转系统] 了解 PowerShell 数据类型和加速器

检索此对象的密码的最简单方法是使用 GetNetworkCredential 方法。接下来我们将返回 password 属性。

$credential.GetNetworkCredential().Password

[玩转系统] 了解 PowerShell 数据类型和加速器

结论

PowerShell 数据类型加速器使 PowerShell 中的复杂操作变得简单。加速器有很多,但通过这些技巧,您应该能够使用 Powershell 获取多种类型并发现新用途。使用加速器通常有独特的方法。了解这些差异将极大地提高您的生产力!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯