Как я могу выполнить скрипты в оболочке 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()
Ответ 3
Попробуйте изменить версию WMF на 5.1 - https://www.microsoft.com/en-us/download/details.aspx?id=54616.