PowerShell 技能连载 - 语音之周:记录语音到文件合成器
内置的 Microsoft 文本到语音引擎可以将音频文件保存到文件。通过这种方式,您可以自动生成 WAV 文件。以下是一个例子:它在您的桌面上创建一个新的 “clickme.wav” 文件,当您打开这个文件时,将会听到语音文本:
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 '\\$' |
有些时候您可能会需要检查一个整数的位数,例如验证用户的输入。以下是一个非常简单的使用正则表达式的方法:
1 | # check the number of digits in an integer |
这个例子演示了如何检查是否是恰好的位数,或者位数处于某个范围。请注意 “^” 代表表达式的起始,”$” 代表表达式的结尾。”\d” 表示一位数字,大括号确定位数。
一个在文件资源管理器中快速启动 PowerShell 的办法是导航到您数据的文件夹,然后点击导航条。这时导航面包屑控件变成了文件夹路径。将它改为 “powershell”,并按下回车键。
这时会打开 PowerShell,并且当前文件夹会设置为您导航到的文件夹。
不过,当前路径下有一个名为 “powershell” 的子文件夹时,这个技巧会失效。在这个例子中,文件资源管理器只会导航到该目录中。
有些 cmdlet 和脚本使用进度条来指示进度。如您在前一个技能中所学的,进度条可能会导致延迟,所以如果您如果不想指示进度,您可能会希望隐藏进度条。以下是实现方法:
以下代码从互联网下载一张图片。Invoke-WebRequest
处理耗时的操作并且在下载时显示一个进度条:
1 | #requires -Version 3.0 |
如果您不想显示进度条,请使用 $ProgressPreference
变量,临时隐藏进度条。请注意代码是如何用大括号包裹起来,并且用 ”&“ 号执行的。通过这种方法,当代码执行完毕后,所有在大括号中改变的变量都会被忽略,所以您不需要将 $ProgressPreference
变量重置为原来的值。
1 | #requires -Version 3.0 |
PowerShell 支持使用进度条。这是一个很简单的例子:
1 | 1..100 | ForEach-Object { |
如果您没有过度使用 Write-Progress
,那么使用进度条是很有价值的。特别在一个长时间的循环中,在循环的每一圈中调用一次 Write-Progress
并没有意义。如果那么做,脚本会变得非常慢。
假设您的循环运行 10000 次。显示一个进度条会显著地拖慢脚本:
1 | $min = 1 |
延迟的时间和 Write-Progress
的调用次数直接相关,所以如果您将 $max
的值改为 100000,该脚本会运行 10 倍的时间,只因为 Write-Progress
调用的次数达到 10 倍。
所以您需要使用一种智能的机制来限制 Write-Progress
的次数。以下例子每增加 0.1% 时跟新一次进度条:
1 | $min = 1 |
当您增加 $max
的数值,您会注意到脚本并不会增加多少时间,因为调用 Write-Progress
的次数仍然没变。
以下是一个快速批量重命名文件的方法,可以用于照片或其它文件。请看:
1 | #requires -Version 1.0 |
只需要调整路径和过滤器,使之指向所需的文件即可。在这个例子中,照片文件夹中的所有 *.jpg 文件中,关键字 “DSC” 将被替换成 “TEST”。请在使用前将脚本的参数改为您想要的。
要递归地重命名文件,请向 Get-ChildItem
命令添加 -Recurse
参数。但是,请小心。这一小段代码可能会导致一不小心对无数文件重命名。
在搜索指定的 AD 账户时,您可能曾经用过 Get-ADUser
命令,并且用 filter 参数来过滤结果。不过这样的过滤器可能会变得非常复杂。
这就是为什么针对最常见的 AD 搜索有一个快捷方式。只需要用 Search-ADAccount
命令即可:
1 | #requires -Modules ActiveDirectory |
Search-ADAccount
暴露一系列参数来搜索最常见的条件。