Silence / Redirect Поток ошибок PowerShell: что мне не хватает? - PullRequest
2 голосов
/ 12 февраля 2020

У меня есть скрипт Powershell для ослабления политики выполнения на компьютере, который по сути работает:

Set-ExecutionPolicy Unrestricted -Force

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

PowerShell.exe -ExecutionPolicy Bypass -File ./psscripts/myScript.ps1

Используя этот трюк, я получаю следующую ошибку:

Set-ExecutionPolicy : Windows PowerShell updated your execution policy successfully, but the setting is overridden by
a policy defined at a more specific scope.  Due to the override, your shell will retain its current effective
execution policy of Bypass.

Ошибка пытается сказать мне, что область действия политики текущего процесса (запущенного с -Bypass) переопределяет тот, который я только что установил, но мне все равно все равно, поэтому я хотел бы просто скрыть эту ошибку.

Я пытался использовать - ErrorAction SilentlyContinue:

Set-ExecutionPolicy Unrestricted -Force -ErrorAction SilentlyContinue

Но ошибка по-прежнему отображается. Поэтому я попытался перенаправить поток ошибок в & NULL следующим образом:

Set-ExecutionPolicy Unrestricted -Force 2> $NULL

... но даже в этом случае ошибка все еще появляется на терминале.

Мне успешно удалось Приглушить ошибку с помощью try-catch, подобного этому:

try{Set-ExecutionPolicy Unrestricted -Force} catch {}

Однако я все же хотел бы понять, почему два других подхода не сработают? Пытаясь перенаправить поток ошибок (или любой поток) в переменную, переменная оказывается пустой, поэтому я предполагаю, что я каким-то образом пытаюсь перенаправить поток из неправильного процесса? Это как-то связано с запуском Powershell из файла .bat?

Кто-нибудь может мне помочь?

1 Ответ

2 голосов
/ 12 февраля 2020

Перенаправление потока вывода ошибок в PowerShell с 2> работает только для не прекращающихся ошибок .

Примечание: -ErrorAction общий параметр работает исключительно на не прекращающихся ошибках, а также - в отличие от , казалось бы, эквивалентных ErrorActionPreference переменная предпочтения , что, что удивительно, также относится к прекращению ошибок - см. Ссылку на выпуск документации GitHub ниже.

Set-ExecutionPolicy испускает завершающую ошибку , которую может обработать только try / catch (и редко используемый оператор trap ).

См. Также:

  • Описание Основные типы ошибок PowerShell в контексте руководства для авторов команд о том, когда следует выдавать завершающий символ. и нескончаемая ошибка: этот ответ .

  • A всеобъемлющий обзор удивительно сложной обработки ошибок PowerShell : этот выпуск документации по GitHub .

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