Как сделать так, чтобы модуль PowerShell CMake отображал полное сообщение об ошибке, а не обрезал его? - PullRequest
0 голосов
/ 01 марта 2019

При запуске CMake с использованием сценария powershell, который завершается неудачей, он всегда обрезает сообщения об ошибках и добавляет к ним суффиксы (или префиксы) с ..., в которых отображаются только первые несколько слов или последние несколько слов, но не полная ошибка.

Например:

Checking paths...     OK
Looking for MSBuild...    OK
Looking for Qt5...    OK
Looking for OpenSSL...    OK
Looking for nsis...    OK
Looking for git...    OK
Looking for cmake...    OK
Configuring the project...
Running cmake
-- The C compiler identification is MSVC 19.0.24215.1
-- The CXX compiler identification is MSVC 19.0.24215.1
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
cmake : CMake Error at extensions/extension-mass-delete/CMakeLists.txt:26 (find_package):
At C:\Users\Petr Bena\Documents\huggle3-qt-lx\windows\release.ps1:172 char:5
+     cmake ..\..\src\ -G "$cmake_generator" -DWEB_ENGINE=true -DPYTHON ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (CMake Error at ...(find_package)::String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Этот тип ошибки совсем не помогает определить, что не так, потому что он слишком общий.Как мне развернуть его, чтобы я увидел полное сообщение об ошибке?

1 Ответ

0 голосов
/ 01 марта 2019

Вы можете использовать блок try{ } catch { }, чтобы перехватить исключение и получить доступ к свойствам ошибки.Вот пользовательская функция записи ошибок, которую я написал:

Function Write-CustomError()
{
<#
.Synopsis
   Displays error information to the console
.DESCRIPTION
    Writes property information from the current [ErrorRecord] object
    in the pipeline to the console
.EXAMPLE
   Write-CustomError -UserMessage "Exception occurred at memory location $x" -ErrorObject $_
.EXAMPLE
   Write-CustomError -UserMessage "Exception occurred at memory location $x" -ErrorObject $_ -FullDetail
.INPUTS
   $Error[0]
.OUTPUTS
   [String]
.COMPONENT
   adminkitMiscTools   
.FUNCTIONALITY
   General Utility
#>
    [cmdletBinding()]
    param(
        [Parameter(Mandatory=$False)]
        [String]$UserMessage,

        [Parameter(Mandatory=$True)]
        [Object]$ErrorObject,

        [Parameter(Mandatory=$false)]
        [Switch]$FullDetail
    )

    BEGIN
    {}
    PROCESS
    {
        if($UserMessage) {
             Write-Host "`nERROR: $UserMessage" -ForegroundColor Red
        }

        if($FullDetail)
        {
            $ErrorData = $ErrorData + [PSCustomObject]@{AccountUsed=$ENV:USERNAME;
                                            ExceptionMessage=$ErrorObject.ToString();
                                            CategoryInfo=$ErrorObject.CategoryInfo;
                                            ExceptionType=$ErrorObject.Exception.GetType();
                                            ErrorDetails=$ErrorObject.ErrorDetails;
                                            FullyQualifiedErrorId=$ErrorObject.FullyQualifiedErrorId;
                                            InvocationInfo=$ErrorObject.InvocationInfo;
                                            PipelineIterationInfo=$ErrorObject.PipelineIterationInfo;
                                            ScriptStackTrace=$ErrorObject.ScriptStackTrace
                                            TargetObject=$ErrorObject.TargetObject;
                                            }
        }
        return $ErrorData
    }
    END
    {}
}

В вашем скрипте:

try { 
      # your cmake command here 
 }
catch {
     Write-CustomError -UserMessage 'There was an error' -ErrorObject $_ -FullDetail
}

Это даст вам гораздо больше подробностей об ошибке и не должно обрезать сообщения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...