Почему системная ошибка: StopUpstreamCommandsException возникает только изнутри Invoke-Command, когда Select-Object -First 1? - PullRequest
1 голос
/ 27 октября 2019

Может ли кто-нибудь объяснить приведенное ниже поведение?

Этот скрипт не возвращает ошибок и работает так, как я ожидаю, что он будет работать:

$obj = [PSCustomObject]@{
    myProp = 'asd'
}          
$propVal = $obj | Select-Object -ExpandProperty myProp -First 1
'prop val 2: ' + $propVal
'No error here: ' + $error

Если я оберну его в Invoke-Command,он выводит следующее:

prop val 1: asd
"System error" from invoke command: System.Management.Automation.StopUpstreamCommandsException: System error.
   at Microsoft.PowerShell.Commands.SelectObjectCommand.ProcessRecord()
   at System.Management.Automation.CommandProcessor.ProcessRecord()

Вот полный скрипт, производящий вышеприведенный вывод.

Invoke-Command -ScriptBlock {                          
    $obj = [PSCustomObject]@{
        myProp = 'asd'
    }          
    $propVal = $obj | Select-Object -ExpandProperty myProp -First 1
    'prop val 1: ' + $propVal
} -ErrorVariable err    
'"System error" from invoke command: ' + $err

Я использую версию PS 5.1.

Я бы очень признателен заобъяснение:

  1. почему StopUpstreamCommandsException поднято?
  2. почему оно вызывается только тогда, когда этот сценарий заключен в Invoke-Command?

1 Ответ

1 голос
/ 29 октября 2019

Основываясь на комментариях выше, если вы захватите переменную ошибки из Select-Object в первом примере, вы увидите ту же ошибку:

$obj = [PSCustomObject]@{
    myProp = 'asd'
}
$propVal = $obj | Select-Object -ExpandProperty myProp -First 1 -ErrorVariable myerr
write-host $myerr[0].ToString()

вывод:

System.Management.Automation.StopUpstreamCommandsException: System error.
   at Microsoft.PowerShell.Commands.SelectObjectCommand.ProcessRecord()
   at System.Management.Automation.CommandProcessor.ProcessRecord()

Из этой проблемы GitHub похоже, что StopUpstreamCommandsException - это «секретное исключение», используемое внутренне, чтобы сообщать восходящим командам в конвейере, что больше не требуется ввод, но он «просачивается» в переменную ошибки вSelect-Object.

Похоже, что это исправлено в этом PR для будущих версий PowerShell, но это может не помочь вам прямо сейчас, если вы используете v5.1. А пока просто игнорируйте ошибку и код вокруг нее, если можете ...

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