为何两次看似相同的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
相关产品推荐
相关产品推荐

