【问题标题】:Function ported from Powershell 5 to Powershell 7 fails with "object reference not set to an instance of an object"从 Powershell 5 移植到 Powershell 7 的函数失败,并显示“对象引用未设置为对象的实例”
【发布时间】:2020-07-10 21:47:41
【问题描述】:

以下代码在 powershell 5.1 中按预期工作:

function Get-Say([String] $Message, [String] $Voice = "Microsoft Irina Desktop") {
    Add-Type -AssemblyName System.speech
    $speak = New-Object System.Speech.Synthesis.SpeechSynthesizer
    $speak.SelectVoice($Voice)
    $speak.Speak($Message)
}

但是,在 powershell 7.1.0(预览版 5)中,执行失败并显示“对象引用未设置为对象的实例”,我实际上迷路了。谷歌搜索没有多大帮助,因为看起来这个错误可能会在非常不同的上下文中遇到。所以,PowerShell 专家,问你一个问题,我该如何解决这个问题。

我试图在正文 (object reference not set to an instance of an object) 中声明参数,希望可能存在一些语义差异,但这没有帮助。

【问题讨论】:

    标签: powershell powershell-7.0


    【解决方案1】:

    这是一个已知问题,因为某些所需的功能在构建 PS v7 的 .NET Core 中不存在。似乎提出了一个错误,但没有修复就关闭了:

    System.Speech.Synthesis.SpeechSynthesizer Speak method throws Object reference not set to an instance of an object." in PowerShell 6.1.2

    【讨论】:

    • 天哪!我最初的理解是微软对 Powershell 进行了大量投资,但这与我使用它的经验相矛盾。老实说,它非常不稳定:(
    • 微软确实在 PowerShell 上投入了大量资金,但为了帮助使其跨平台,他们基于 .NET Core 的较新版本,这是在 Windows 上运行的 .NET 的子集, Linux 和 Mac。我想他们的首要任务是首先移植最广泛使用的功能,然后再处理更不常用的东西(如 SpeechSynthesizer)(如果有的话)。作为一个产品,我不认为它是不稳定的,只是脱离 Windows 独占性限制了他们立即可以做的事情,所以你需要注意版本之间的关系。
    • 好吧,对于最终用户来说,看起来特定组件一直在工作,而更新刚刚停止。不仅停止,而且失败并显示一条神秘的消息。在同一台机器上,无需更新操作系统。
    • 另外,您可能需要密切关注Preview 这个词。这实际上意味着您应该看到某种类型的不稳定性,并且它还没有准备好用于生产使用。只是想指出这一点。
    • @PatrickMcvay 这是一个有效的不,不能反驳。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2020-06-12
    • 2011-01-30
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    相关资源
    最近更新 更多