Powershell Invoke-Comment -ErrorVariable вывод неполный - PullRequest
0 голосов
/ 11 января 2019

Итак, я пытался получить полное сообщение об ошибке и трассировку стека из ошибок Invoke-Command, но мне не повезло.

Я запустил этот код:

Invoke-command -COMPUTER "TESTCOMPUTER" -ScriptBlock {

    klist purge -li 0x3e7

    Return Get-Service

} -ErrorVariable errmsg

Write-Host "`r`nError: $errmsg"

И это вывод, который я получил в консоли:

[TESTCOMPUTER] Не удалось подключиться к удаленному серверу TESTCOMPUTER со следующим сообщением об ошибке: WinRM не может завершить операцию. Убедитесь, что указанное имя компьютера является действительным, что компьютер доступен по сети и что исключение брандмауэра для Служба WinRM включена и разрешает доступ с этого компьютера. По умолчанию исключение брандмауэра WinRM для общедоступных профилей ограничивает доступ к удаленные компьютеры в той же локальной подсети. Для получения дополнительной информации см. Раздел справки about_Remote_Trou Troubleshooting. + CategoryInfo: OpenError: (TESTCOMPUTER) [], PSRemotingTransportException + FullyQualifiedErrorId: WinRMOperationTimeout, PSSessionStateBroken

Ошибка: [TESTCOMPUTER] Соединение с удаленным сервером TESTCOMPUTER завершилось неудачно со следующим сообщением об ошибке: WinRM не может завершить операцию. Убедитесь, что указанное имя компьютера является действительным, что компьютер доступен по сети и что исключение брандмауэра для WinR Служба М включена и разрешает доступ с этого компьютера. По умолчанию исключение брандмауэра WinRM для общедоступных профилей ограничивает доступ к удаленному управлению. Компьютеры в одной локальной подсети. Для получения дополнительной информации см. Раздел справки about_Remote_Trou Troubleshooting.

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

1 Ответ

0 голосов
/ 11 января 2019

ErrorVariable является System.Management.Automation.ErrorRecord.
Если вы сделаете Get-Member для этой переменной, вы увидите, что она имеет следующие методы и свойства:

Name                  MemberType     Definition
----                  ----------     ----------
Equals                Method         bool Equals(System.Object obj)
GetHashCode           Method         int GetHashCode()
GetObjectData         Method         void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context), void ISeri...
GetType               Method         type GetType()
ToString              Method         string ToString()
writeErrorStream      NoteProperty   bool writeErrorStream=True
CategoryInfo          Property       System.Management.Automation.ErrorCategoryInfo CategoryInfo {get;}
ErrorDetails          Property       System.Management.Automation.ErrorDetails ErrorDetails {get;set;}
Exception             Property       System.Exception Exception {get;}
FullyQualifiedErrorId Property       string FullyQualifiedErrorId {get;}
InvocationInfo        Property       System.Management.Automation.InvocationInfo InvocationInfo {get;}
PipelineIterationInfo Property       System.Collections.ObjectModel.ReadOnlyCollection[int] PipelineIterationInfo {get;}
ScriptStackTrace      Property       string ScriptStackTrace {get;}
TargetObject          Property       System.Object TargetObject {get;}
PSMessageDetails      ScriptProperty System.Object PSMessageDetails {get=& { Set-StrictMode -Version 1; $this.Exception.InnerException.PSMessageDetails };}

Если вы пропустите Write-Host и просто закроете свой код

$errmsg

Будет возвращена вся ошибка (цвет ошибки, т. Е. Красный)

Вы можете создать полное сообщение об ошибке, комбинируя различные свойства объекта $errmsg следующим образом:

$err = "`r`nError: {0}`r`n    + CategoryInfo          : {1}`r`n    + FullyQualifiedErrorId : {2}" -f $errmsg.ErrorDetails, $errmsg.CategoryInfo, $errmsg.FullyQualifiedErrorId
Write-Host $err

Или используйте Here-String для лучшей читаемости:

$err = @"
Error: $($errmsg.ErrorDetails)
    + CategoryInfo          : $($errmsg.CategoryInfo)
    + FullyQualifiedErrorId : $($errmsg.FullyQualifiedErrorId)
"@ 
Write-Host $err

Возможно, к нему добавится еще несколько интересных свойств, но это зависит от вас.

...