Как я могу выполнить скрипты в оболочке powershell, созданной кодом, в которой есть команды Write-Host?

У меня есть script, который я пишу, который полагается на функции в импортированном модуле. Этот script занимает некоторое время из-за IO (веб-запросов), и я хотел бы его разделить на сотни тысяч итераций блока script.

После попытки нескольких разных методов (с небольшим успехом из-за ограничений с помощью Start-Job и других вещей) текущая реализация основана на предварительном создании пула оболочек powershell, созданных с помощью $shell = [Powershell]::Create().

Один из методов модуля, который я должен вызвать для начальной загрузки оболочки (поэтому в правильном состоянии), имеет вызов Write-Host в ней. Когда я вызываю $shell.Invoke(), возникает следующая ошибка:

Write-Host: команда, которая запрашивает у пользователя ошибку, потому что хост-программа или тип команды не поддерживают пользователя взаимодействие. Попробуйте хост-программу, которая поддерживает взаимодействие с пользователем, например, Windows PowerShell Console или Windows PowerShell ISE и удалять команды, связанные с подсказками, из типов команд, которые не поддерживают взаимодействие с пользователем, например Рабочие процессы Windows PowerShell.

Теперь, поскольку модуль является настраиваемым, я могу удалить вызовы Write-Host, но это уменьшает удобство для пользователя, когда он запускается непосредственно конечными пользователями. Я могу создать параметр switch, который не выполняет Write-Host, если параметр имеет значение true, но сделать это по строке - это хорошая работа (возможно, но я бы предпочел).

Можно ли каким-либо образом получить Write-Host, чтобы не было ошибок в этом сценарии? Я действительно не забочусь о входе в этот сценарий, я просто не хочу ошибок.

Ответ 1

Самый быстрый способ заставить это работать - определить фиктивную функцию write-host в вашем script или просто определить ее в пространстве выполнения независимо от запуска script.

$ps.addscript("function write-host {}").invoke()
$ps.commands.clear()
# now you can invoke scripts that use write-host
# feel free to implement a write-host that writes to a log file

Просто. Причина, по которой вы получаете эту ошибку, связана с тем, что программный вызов вроде этого не ожидает взаимодействия с пользователем. Есть способы сделать эту работу, но в ней используются разные API.

Ответ 2

Если вам нужен выход, вы можете использовать:

$ps.addscript("function write-host($out) {write-output $out}").invoke()
$ps.commands.clear()