【发布时间】:2016-02-07 02:20:20
【问题描述】:
我正在编写一个 PowerShell 脚本,它使用反射 API 来获取程序集中的所有命名空间。无论如何,这无关紧要。以下是代码的相关部分:
function Get-Namespaces($assembly)
{
$assemblyClass = [Reflection.Assembly]
$assemblyObject = $assemblyClass::ReflectionOnlyLoadFrom($assembly)
$types = $assemblyObject.GetTypes() # This is the part that's having issues
return $types | ? IsPublic | select Namespace -Unique
}
cd $PSScriptRoot
$assemblies = @()
$assemblies += Get-WpfAssemblies
$assemblies += Get-UwpAssembly
$namespaces = $assemblies | % {
% { Get-Namespaces $_ }
}
由于某种原因,初始化$types 的部分似乎有问题;具体来说,它告诉我捕获异常并检查捕获的异常的LoaderExceptions 属性以获取更多信息。所以当我尝试这样做时:
try { $assemblyObject.GetTypes() } catch { echo $_.LoaderExceptions }
运行它,脚本什么也不打印。
为什么会发生这种情况,我该如何解决?
对于想要完整试用该脚本的人,我已经公开了GitHub gist.(请注意,它仅在您安装了 Windows 10 开发工具的情况下才有效,但我确信合理有经验的 PowerShell 用户可以修改脚本以在他们的机器上运行。)
【问题讨论】:
-
try只会捕获终止错误,因此您的 catch 块可能没有被执行。当您只有$assemblyObject.GetTypes()时,控制台中会显示什么 -
@Matt 此消息:
Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information. -
我不认为这会被填充,但您是否在此处看到您的错误:
$error。这是一个包含所有最近错误的自动变量。$error[0]应该是最后一个错误。请注意,它包含您会话中的所有错误。 -
$_在 catch 块中是System.Management.Automation.ErrorRecord。它没有属性LoaderExceptions。因此,非严格模式下的echo为空。是这样吗? -
$_.Exception.InnerException.LoaderExceptions
标签: windows powershell error-handling scripting