Вопрос или проблема
Если я получаю ошибку с командой PowerShell, вывод обрезается тремя точками.
Три точки “…” в ошибках PowerShell указывают на то, что доступна дополнительная информация об ошибке, но она была опущена в отображаемом сообщении для краткости. Обычно вы можете получить полные детали ошибки, направив ошибку в командлет, такой как Format-List
или Out-String
.
Однако я заметил, что это не дает мне полный вывод. Есть ли что-то еще, что я могу сделать, чтобы получить полный вывод?;)
$result = Invoke-AzOperationalInsightsQuery -WorkspaceId $appId -Query $query
Invoke-AzOperationalInsightsQuery : Операция вернула недопустимый код состояния ‘NotFound’
На строке:1 символ:11
- $result = Invoke-AzOperationalInsightsQuery -WorkspaceId $appId -Quer …
-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- CategoryInfo : CloseError: (:) [Invoke-AzOperationalInsightsQuery], ErrorResponseException
- FullyQualifiedErrorId : Microsoft.Azure.Commands.OperationalInsights.Query.InvokeOperationalInsightsQuery
Смотрите $error[0] | select *
для получения дополнительной информации:
dir foo3
dir : Невозможно найти путь 'C:\users\admin\foo3', потому что он не существует.
На строке:1 символ:1
+ dir foo3
+ ~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\users\admin\foo3:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
$error[0] | select *
writeErrorStream : True
PSMessageDetails :
Exception : System.Management.Automation.ItemNotFoundException: Невозможно найти путь 'C:\users\admin\foo3'
потому что он не существует.
в System.Management.Automation.SessionStateInternal.GetChildItems(String path, Boolean
recurse, UInt32 depth, CmdletProviderContext context)
в Microsoft.PowerShell.Commands.GetChildItemCommand.ProcessRecord()
TargetObject : C:\users\admin\foo3
CategoryInfo : ObjectNotFound: (C:\users\admin\foo3:String) [Get-ChildItem], ItemNotFoundException
FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
ErrorDetails :
InvocationInfo : System.Management.Automation.InvocationInfo
ScriptStackTrace : в <ScriptBlock>, <No file>: строка 1
PipelineIterationInfo : {0, 1}
Ответ или решение
В PowerShell, когда вы получаете сообщение об ошибке, оно может быть сокращено с помощью трех точек "…", что указывает на то, что есть дополнительная информация о ошибке, которая была пропущена для краткости. Эта ситуация часто может запутывать пользователей, особенно когда требуется получить полную информацию об ошибке для её диагностики и устранения.
Если вы видите сокращённый вывод ошибки, есть несколько методов, которые могут помочь вам получить доступ к полным данным об ошибке:
-
Использование переменной
$error
:
PowerShell автоматически сохраняет информацию об ошибках в массиве$error
. Чтобы получить больше информации о самой последней ошибке, вы можете использовать следующую команду:$error[0] | Select-Object *
Этой командой вы получите полный объект ошибки, включая информацию, которую не показывает стандартный вывод.
-
Вывод ошибки с помощью
Format-List
:
Если вы хотите получить более структурированный вывод ошибки, вы можете воспользоваться командлетомFormat-List
, который предоставляет детализированный вывод. Например:$error[0] | Format-List -Force
Это поможет вам увидеть дополнительные свойства объекта ошибки, такие как
InvocationInfo
,CategoryInfo
и другие. -
Использование
Out-String
:
Если вы все еще не видите всю необходимую информацию, вы можете использоватьOut-String
для полного вывода текста ошибки. Команда будет выглядеть так:$error[0] | Out-String -Width 4096
Эта команда гарантирует, что текст ошибки выведен в виде строки с максимально возможной шириной, что позволяет избежать обрезки на экране.
-
Проверка "FullyQualifiedErrorId" и "CategoryInfo":
В выводе ошибки обычно присутствуют поляFullyQualifiedErrorId
иCategoryInfo
, которые предоставляют ключевую информацию о том, что произошло. Используйте это для поиска решений в официальной документации или на ресурсах, таких как Stack Overflow. -
Слово о
Try/Catch
:
Если вы обрабатываете ошибки в скриптах, вы можете использовать блокиtry/catch
для перехвата ошибок и их обработки, что даст вам больше контроля над выводом и сообщениями об ошибках:try { Invoke-AzOperationalInsightsQuery -WorkspaceId $appId -Query $query } catch { Write-Host "Произошла ошибка:" -ForegroundColor Red $_ | Format-List -Force }
Следуя этим шагам, вы сможете получить доступ ко всем доступным данным об ошибках и лучше понять проблемы, с которыми сталкиваетесь в PowerShell.