Это может быть связано с тем, указали ли вы ErrorAction или нет, но я не уверен, как это относится к попытке catch, хотя.Я сделал что-то подобное, где мой foreach не остановился бы, если явно не указано.
В основном вам нужно указать, что должно произойти, если при каждом вызове происходит ошибка, как, например,
Call-Something $SomeParam -ErrorAction Stop
вы указываете его, как указано выше, для каждого вызова или в начале вашего скрипта, поскольку нижеуказанные ошибки могут игнорироваться.
// at the start of your script
$ErrorActionPreference = "Stop"
Для получения дополнительной информации вы можете прочитать об ErrorAction в powershell, например, https://blogs.msdn.microsoft.com/kebab/2013/06/09/an-introduction-to-error-handling-in-powershell/
И в соответствии с msdn это допустимые значения:
Stop: отображает сообщение об отладке и прекращает выполнение.Записывает сообщение об ошибке в консоль.
Запрос: отображает сообщение об отладке и спрашивает, хотите ли вы продолжить.Обратите внимание, что добавление общего параметра Debug к команде - когда команда настроена на создание сообщения отладки - изменяет значение переменной $ DebugPreference на Inquire.
Continue: отображает сообщение отладки и продолжает свыполнение.
SilentlyContinue: без эффекта.Отладочное сообщение не отображается (по умолчанию), и выполнение продолжается без прерывания.