Существует автоматическая переменная $ StackTrace
, но она, кажется, немного более специфична для внутренних деталей PS, чем собственно забота о вашем скрипте, так что это не будет большая помощь.
Существует также Get-PSCallStack
, но его нет, как только вы нажмете исключение, к сожалению. Однако вы можете поместить Get-PSCallStack
перед каждым броском в вашем скрипте. Таким образом, вы получите трассировку стека непосредственно перед выполнением исключения.
Я думаю, что можно было бы написать такую функциональность, используя функции отладки и трассировки Powershell, но я сомневаюсь, что это будет легко.
В блоге команды PowerShell Team есть функция под названием Resolve-Error, которая даст вам всевозможные подробности
Обратите внимание, что $ error - это массив всех ошибки, с которыми вы столкнулись в вашей PSSession. Эта функция сообщит вам последние ошибки, с которыми вы столкнулись.
function Resolve-Error ($ErrorRecord=$Error[0])
{
$ErrorRecord | Format-List * -Force
$ErrorRecord.InvocationInfo |Format-List *
$Exception = $ErrorRecord.Exception
for ($i = 0; $Exception; $i++, ($Exception = $Exception.InnerException))
{ "$i" * 80
$Exception |Format-List * -Force
}
}
Вы не можете получить трассировку стека из исключений кода сценариев PowerShell, только из объектов .NET. Для этого вам нужно получить объект Exception, например, один из них:
$Error[0].Exception.StackTrace
$Error[0].Exception.InnerException.StackTrace
$Error[0].StackTrace
Споткнувшийся после этого поиска созданного в решении. Я иду с простым решением. Просто добавьте блок трассировки перед использованием любого powershell. Это гарантирует, что стек вызовов показывают. Вниз сторона этого является стеком, будет отображен перед сообщением об ошибке.
Trace {
Споткнувшийся после этого поиска созданного в решении. Я иду с простым решением. Просто добавьте блок трассировки перед использованием любого powershell. Это гарантирует, что стек вызовов показывают. Вниз сторона этого является стеком, будет отображен перед сообщением об ошибке.
[110].ScriptStackTrace
}
Этот код:
try {
...
}
catch {
Write-Host Этот код:
[110] повторит ошибку в следующем формате:
No match was found for the specified search criteria and module names 'psake'.
at Get-InstalledModule<Process>, ...\PSModule.psm1: line 9251
at Import-ModuleThirdparty, ...\Import-ModuleThirdparty.psm1: line 3
at <ScriptBlock>, ...\index.ps1: line 13
.Exception.Message -Foreground "Red"
Write-Host Этот код:
[110] повторит ошибку в следующем формате:
No match was found for the specified search criteria and module names 'psake'.
at Get-InstalledModule<Process>, ...\PSModule.psm1: line 9251
at Import-ModuleThirdparty, ...\Import-ModuleThirdparty.psm1: line 3
at <ScriptBlock>, ...\index.ps1: line 13
.ScriptStackTrace -Foreground "DarkGray"
exit 1
}
повторит ошибку в следующем формате:
No match was found for the specified search criteria and module names 'psake'.
at Get-InstalledModule<Process>, ...\PSModule.psm1: line 9251
at Import-ModuleThirdparty, ...\Import-ModuleThirdparty.psm1: line 3
at <ScriptBlock>, ...\index.ps1: line 13
Вот способ: Отслеживание стека скриптов
Ядро этого кода:
1..100 | %{ $inv = &{ gv -sc $_ myinvocation }