Установить жестко запрограммированный ввод для следующего вызова Read-Host

У меня есть сценарий PowerShell (который я не могу изменить) со следующей функцией внутри него:

function Foo ([string] param1) {
    [...]
    $var1 = Read-Host "Test"
    $var2 = Read-Host "Test2"
    [...]
}

Я хочу вызвать функцию из моего сценария PowerShell и не хочу, чтобы пользователь вводил какие-либо значения, вместо этого я хочу подготовить жестко запрограммированные значения.

Я пробовал следующее:

@("Var1Value", "Var2Value") | Foo "Param1Value"

Но это все равно подсказывает пользователю. Любые идеи?


person D.R.    schedule 07.01.2021    source источник
comment
Ответ Матиаса - это умный обходной путь, предполагающий, что строки подсказок известны и статичны; если функция Foo находится внутри модуля, вам придется временно создать глобальную Read-Host функцию (function global:Read-Host { ... }).   -  person mklement0    schedule 07.01.2021
comment
Вообще говоря: Внутри сеанса PowerShell Read-Host читает только с хоста (обычно терминала) в интерактивном режиме. Однако, когда ввод stdin предоставляется вне сеанса, через PowerShell CLI, Read-Host читает из него - см. этот ответ.   -  person mklement0    schedule 07.01.2021


Ответы (1)


Во время обнаружения команд функции имеют приоритет над двоичными командлетами, поэтому вы можете спрятать Read-Host за поддельной Read-Host функцией:

# define local Read-Host function
function Read-Host {
  param([string]$Prompt)

  return @{Test = 'Var1Value'; Test2 = 'Var2Value'}[$Prompt]
}

# call foo
foo 

# remove fake `Read-Host` function again
Remove-Item function:\Read-Host -Force
person Mathias R. Jessen    schedule 07.01.2021
comment
Очень умно, как всегда! - person Doug Maurer; 08.01.2021