PowerShell 技能连载 - 使用类(初始化属性 - 第二部分)
可以为类的属性手动指定一个数据类型和缺省值。当您从一个类实例化一个对象时,属性已经填充好并且只接受指定的数据类型:
1 | #requires -Version 5.0 |
可以为类的属性手动指定一个数据类型和缺省值。当您从一个类实例化一个对象时,属性已经填充好并且只接受指定的数据类型:
1 | #requires -Version 5.0 |
从 PowerShell 5.0 开始,引入了一个新的关键字 “class”。它能够创建新的类。您可以使用类作为新对象的模板。一下代码定义了一个名为 “Info” 的新类的模板,这个类有一系列属性:
1 | #requires -Version 5.0 |
您可以使用 New-Object
来创建这个类的任意多个新实例。每个实例代表有三个属性的 “Info” 类型的一个新对象。
1 | Name Computer Date |
这是一个非常简单(但很有用)的例子,演示了如何使用类来生产对象。如果您只希望在新对象中存储一些零碎信息,您也可以使用 PowerShell 3.0 引入的 [PSCustomObject]
语法:
1 | #requires -Version 3.0 |
这种做法没有使用一个蓝本(类),而是根据哈希表创建独立的新对象:
1 | Name Computer Date |
所以新创建的对象类型永远是 “PSCustomObject
“而在前一个例子中,对象的类型是通过类名定义的。
使用 .NET 的类型名称很麻烦,因为这些名字很长。以下是一个例子:
1 | #requires -Version 2.0 |
在 PowerShell 5.0 以上版本,您可以定义希望使用的 .NET 命名空间。这些 “using namespace
“ 语句必须放在脚本的开头。此时代码的可读性变得更好,并且 using 语句明确了该脚本使用了哪些 .NET 命名空间:
1 | #requires -Version 5.0 |
以下是另一个例子:System.IO.Path
.NET 命名空间包含一系列有用的路径工具方法。以下是一些例子:
1 | [System.IO.Path]::ChangeExtension('test.txt', 'bat') |
现在可以不必重复地使用 [System.IO.Path]
来访问这些方法。添加一句 “using namespace System.IO
“ 语句之后就可以直接访问 [Path]
类型:
1 | #requires -Version 5.0 |
您是如何基于生日确定一个人的年龄?您可以将 Get-Date
命令返回的当前时间减去生日事件,但是结果并不包含年数:
1 | #requires -Version 1.0 |
以下是结果:
1 | Days : 13905 |
要计算年数,请取 “ticks” 的数值(衡量时间最小单位),并且转换为 datetime 类型,然后取年数并减一:
1 | #requires -Version 1.0 |
这是计算结果的样子:
1 | Born on 1978-12-09 = 38 Years old (at time of printing) |
New-Object
创建新的对象实例,在之前的“语音之周”中,您已经见到了如何创建一个语音合成器对象,并且将文本转换为语音:
1 | Add-Type -AssemblyName System.Speech |
创建对象的方法是类似的,所以如果换成一个不同的类,例如 System.Net.NetworkInformation.Ping
,就可以 ping 某个 IP 地址或主机名:
1 | $ping = New-Object -TypeName System.Net.NetworkInformation.Ping |
在 PowerShell 5.0 或以上版本,有另一种方法来代替 New-Object
,而且用起来更快:使用任意类型暴露的 New()
静态方法。您可以像这样重写以上的例子:
1 | Add-Type -AssemblyName System.Speech |
类似地:
1 | $ping = [System.Net.NetworkInformation.Ping]::New() |
或者,可以精简:
1 | [System.Net.NetworkInformation.Ping]::New().Send('powershellmagazine.com', 1000) |
请注意:一旦您使用 New()
来代替 New-Object
,您的代码需要 PowerShell 5.0 以上版本。
.NET 语音引擎不止可以接受文本输入。如果您使用 SpeakSsm()
,您可以使用 XML 来切换语言、速度,以及其它文本到语音转换的参数。
以下例子需要同时安装了英语和德语的语音。如果您没有安装德语语音,请使当地修改脚本中的语言 ID。以下是查找系统中可用的语言 ID 的方法:
1 | PS C:\> Add-Type -AssemblyName System.Speech |
以下是完整的例子:
1 | #requires -Version 2.0 |
内置的 Microsoft 文本到语音引擎可以将音频文件保存到文件。通过这种方式,您可以自动生成 WAV 文件。以下是一个例子:它在您的桌面上创建一个新的 “clickme.wav” 文件,当您打开这个文件时,将会听到语音文本:
1 | #requires -Version 2.0 |
在前一个技能中我们演示了如何使用语音转换器来念出文本。以下是查找您系统中安装的语言的方法:
1 | #requires -Version 2.0 |
结果类似如下:
1 | Culture Name Gender Age |
用这行代码可以返回缺省的语音:
1 | $speak.Voice |
假设您的系统安装了多个语音,以下是选择一个不同语音的方法。只需要传入您想使用的语音名字。这个例子在德文 Windows 10 系统上使用德语语音引擎:
1 | #requires -Version 2.0 |
当您将 “System.Speech
“ 程序集添加到 PowerShell 中后,就可以使用新增的 “SpeechSynthesizer
“ 类将文字转成语音:
1 | Add-Type -AssemblyName System.Speech |
请注意语音讲述人用的是您系统的缺省语音。您的讲述人缺省情况下可能说的不是英文。我们将在接下来的技能当中介绍如何使用不同的语音。
我们处理路径时,常常需要使路径“标准化”。例如确保所有的路径都以反斜杠结尾。一种尝试如下:
1 | $path = 'c:\temp' |
这段代码用正则表达式来查找一段文本尾部的反斜杠。如果不存在,则添加一个反斜杠。
如果您想删除路径尾部的反斜杠,您可以直接使用 -replace
运算符:
1 | $path = 'c:\temp\' -replace '\\$' |