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

[玩转系统] 了解使用 PowerShell 转换转换对象类型

作者:精品下载站 日期:2024-12-14 20:48:35 浏览:15 分类:玩电脑

了解使用 PowerShell 转换转换对象类型


PowerShell 不是一种严格类型的语言,这意味着它不会强制您在每次需要创建对象时都定义特定类型的对象。您可以使用 PowerShell 将字符串转换为整数、将字符串转换为日期以及任何其他类似类型。您可以将对象从一种类型转换为另一种类型。

PowerShell 中的一切都是对象。但是,您不必具体告诉 PowerShell 您想要哪种对象。

例如,使用 Get-Service 命令查询服务,并使用 Get-Member 命令查看它返回的对象类型。请注意,Get-Member 返回的 TypeName 类型为 System.ServiceProcess.ServiceController

PS> Get-Service -Name wuauserv | Get-Member

   TypeName: System.ServiceProcess.ServiceController

Name                      MemberType    Definition
----                      ----------    ----------
<SNIP>

您不必明确告诉 PowerShell 您想要该类型的对象,它就会这样做。

但是,如果您不想要那种对象怎么办?也许您需要对特定类型的对象调用某些特定方法,或者需要引用不同对象的属性。在这种情况下,您将使用 PowerShell 将该对象转换到另一个对象或执行类型转换。

将字符串转换为 Int

转换是一个编程术语,定义将一种类似对象类型“转换”为另一种对象类型。但并非所有对象都可以相互转换。

假设您有一个定义为数字的字符串。您可以通过将字符串括在单引号或双引号中来定义字符串,如下所示。

PS> $string = '1'
PS> $string.GetType().Name
String

当您查看 $string 的值时,您会发现它是 1。够简单的。

PS> $string
1

如果 $string 是数字 1,您应该能够向其添加一个数字,对吗?让我们来看看吧。

PS> $string + 2
12

嗯..上次我检查 1 + 2 不是 12。这是怎么回事?

由于 $string 只是字符串数据,PowerShell 并未将这两个数字相加。相反,它将它们连接在一起,本质上只是将两者合并。

为了让 PowerShell 将两个数字相加,我们必须首先通过将字符串转换为 int 来告诉 PowerShell $string 实际上是一个数字。为此,我们使用 PowerShell 使用强制转换运算符将该字符串显式强制转换为整数类型。

PS> $string = [int]$string
1

现在让我们再次尝试将这两个数字相加。

PS> $string + 2
3

由于我们 $string 转换为整数或使用 PowerShell 将字符串“转换”为 int,PowerShell 现在能够将它们加在一起。铸造对象完全改变它们的属性,允许您对它们执行不同的操作。

其他有用的铸造场景

在PowerShell中,您可以强制转换各种对象。

转换为 XML

例如,采用 XML 文件。 XML 文件只是一堆字符串。 PowerShell 不知道 XML 是一种结构化格式。

例如,也许我们有一个简单的 XML 文件,如下所示:

<person>
    <firstname>Adam</firstname>
    <lastname>Bertram</lastname>
    <levelofawesome>Really high</levelofawesome>
</person>

如果该文件位于 C:\person.xml 中,您可以使用 Get-Content 命令读取它,它将返回 XML 或 PowerShell 认为的内容一串字符串。

PS C:\> Get-Content C:\person.xml
<person>
    <firstname>Adam</firstname>
    <lastname>Bertram</lastname>
    <levelofawesome>Really high</levelofawesome>
</person>

但是,您知道这是 XML,而不仅仅是一堆字符串,并且您需要使用 XPath 对其执行一些 XML 搜索。 PowerShell 有一个名为类型加速器的概念,它允许您轻松地将这组看起来像 XML 的字符串转换为实际的 XML 对象。

在变量声明前面添加 [xml] 告诉 PowerShell 将从 Get-Content 获取的字符串组转换为数据类型 XML 对象。现在您可以在下面看到您引用的属性,例如 person 以及所有属性。

PS> [xml]$person = Get-Content -Path 'C:\person.xml'
PS> [xml]$person

person
------
person


PS> ([xml]$person).person

firstname lastname levelofawesome
--------- -------- --------------
Adam      Bertram  Really high

您现在还可以看到该对象的类型为 System.Xml.XmlDocument,它揭示了您可以使用的大量特定于 XML 的方法和属性。

将字符串转换为日期

与 XML 类似,我们还可以将字符串转换为日期时间对象或使用 PowerShell 将字符串转换为日期。要创建日期时间对象,只需定义一个看起来像日期的字符串,例如1/20/80。对于你和我来说,这是一个日期,但正如你所见,PowerShell 不知道。对此没有特定日期的事情要做。它只是一个字符串。

PS> $date = '1/20/80'
PS> $date | Get-Member

PS C:\> $date | Get-Member


   TypeName: System.String

Name             MemberType            Definition
----             ----------            ----------
Clone            Method                System.Object Clone(), System.Object ICloneable.Clone()
CompareTo        Method                int CompareTo(System.Object value), int CompareTo(string strB), int IComparable.CompareTo(System.Object obj), int ...
Contains         Method                bool Contains(string value)
CopyTo           Method                void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count)
EndsWith         Method
<SNIP>

但是,在该字符串前面加上 [datetime] 会将该字符串转换为日期时间对象,然后您可以利用许多特定于日期时间的方法和属性。

PS> [datetime]$date = '1/20/80'
PS> $date | Get-Member


   TypeName: System.DateTime

Name                 MemberType     Definition
----                 ----------     ----------
Add                  Method         datetime Add(timespan value)
AddDays              Method         datetime AddDays(double value)
AddHours             Method         datetime AddHours(double value)
AddMilliseconds      Method         datetime AddMilliseconds(double value)
AddMinutes           Method         datetime AddMinutes(double value)
AddMonths            Method         datetime AddMonths(int months)
<SNIP>

将哈希表转换为 PSCustomObject

对于最后一个示例,也是我经常做的一个示例,是将哈希表转换为 PSCustomObject 类型。

PS> $person = @{'FirstName' = 'Adam'; 'LastName' = 'Bertram'}
PS> $person.GetType().Name
HashTable

PS> ([pscustomobject]$person).GetType().Name
PSCustomObject

一旦对象属于 PSCustomObject,您就可以引用对象属性,例如 $person.FirstName$person.LastName 等。

概括

在这篇博文中,您了解了 PowerShell 如何处理对象以及 PowerShell 如何将某些对象转换为其他对象。我们介绍了一些常见的转换,例如字符串到整数和字符串到日期时间对象,还介绍了称为类型加速器的 PowerShell 概念,它提供了将对象转换为各种 .NET 对象的快捷方式。

如果您想详细了解 PowerShell 如何处理对象,甚至使用鲜为人知的 PSTypeName 功能构建您自己的自定义类型,请查看使用 PowerShell 和 PSTypeName 构建自定义对象类型嗯>。

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

取消回复欢迎 发表评论:

关灯