You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两次看似相同的PowerShell [Windows.Media.Ocr.OcrEngine]调用结果不同?

PowerToys文本提取器相关PowerShell类型调用问题解答

问题描述

我在研究PowerToys文本提取器,想查看已安装的语言类型,从官方文档获取了PowerShell代码,但运行行为让人困惑。以下是意大利语本地化控制台的输出内容:

PS C:\Users\Carlo> [Windows.Media.Ocr.OcrEngine]::AvailableRecognizerLanguages
Impossibile trovare il tipo [Windows.Media.Ocr.OcrEngine].
In riga:1 car:1
+ [Windows.Media.Ocr.OcrEngine]::AvailableRecognizerLanguages
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Windows.Media.Ocr.OcrEngine:TypeName) [], RuntimeException
    + FullyQualifiedErrorId : TypeNotFound

PS C:\Users\Carlo> [Windows.Media.Ocr.OcrEngine, Windows.Foundation, ContentType = WindowsRuntime]

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    OcrEngine                                System.Runtime.InteropServices.WindowsRuntime.RuntimeClass


PS C:\Users\Carlo> [System.Runtime.InteropServices.WindowsRuntime.RuntimeClass]::AvailableRecognizerLanguages
Impossibile trovare il tipo [System.Runtime.InteropServices.WindowsRuntime.RuntimeClass].
In riga:1 car:1
+ [System.Runtime.InteropServices.WindowsRuntime.RuntimeClass]::Availab ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Runtime....me.RuntimeClass:TypeName) [], RuntimeException
    + FullyQualifiedErrorId : TypeNotFound

PS C:\Users\Carlo> [Windows.Media.Ocr.OcrEngine]

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    OcrEngine                                System.Runtime.InteropServices.WindowsRuntime.RuntimeClass


PS C:\Users\Carlo> [Windows.Media.Ocr.OcrEngine]::AvailableRecognizerLanguages


DisplayName     : Inglese (Regno Unito)
LanguageTag     : en-GB
NativeName      : English (United Kingdom)
Script          : Latn
LayoutDirection : Ltr
AbbreviatedName : ENG

DisplayName     : Italiano (Italia)
LanguageTag     : it-IT
NativeName      : italiano (Italia)
Script          : Latn
LayoutDirection : Ltr
AbbreviatedName : ITA

最终得到了预期结果,但为何首次调用[Windows.Media.Ocr.OcrEngine]::AvailableRecognizerLanguages报错,后续看似相同的调用却正常返回信息?

原因解释

这是PowerShell加载Windows Runtime (WinRT) 类型的机制导致的:

  • 首次直接调用[Windows.Media.Ocr.OcrEngine]::AvailableRecognizerLanguages时,PowerShell的类型系统中还未加载这个WinRT类型,因此抛出「找不到类型」的错误。
  • 执行[Windows.Media.Ocr.OcrEngine, Windows.Foundation, ContentType = WindowsRuntime]这条命令时,你显式指定了该类型所属的程序集和类型特性,PowerShell会根据这些信息将对应的WinRT类型加载到当前会话的类型缓存中。
  • 后续再调用[Windows.Media.Ocr.OcrEngine]时,PowerShell已经能从缓存中找到该类型,因此可以正常访问它的静态属性AvailableRecognizerLanguages,返回预期的语言列表。

简单来说,WinRT类型不会像.NET Framework类型那样被PowerShell自动发现,必须先通过完整的类型标识显式加载一次,之后在当前会话内就能直接使用简化的类型名称调用了。

内容的提问来源于stack exchange,提问作者CapelliC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:15:58