Я пытаюсь собрать сценарий PowerShell, который мы можем использовать для некоторых пользовательских сценариев для коммерческого решения для ИТ-мониторинга (StableNet от Infosim.de). Продукт имеет удобную функцию безопасной передачи параметров в сценарии и позволяет избежать просмотра параметров в системных инструментах, таких как ps/Task Manager. Вместо того, чтобы использовать их в качестве параметров в командной строке, решение может вызвать сценарий с параметром «--inline», который ожидает, что вызываемый сценарий затем прочитает все остальные параметры посредством установки встроенных параметров. При использовании встроенных параметров выполняемый сценарий должен иметь возможность запуститься и дождаться, пока вызывающий код предоставит параметры, разделенные CR/LF.
Я написал код на C#, который просто использует:
string host = Console.ReadLine(); string user = Console.ReadLine(); string pass = Console.ReadLine(); string filePath = Console.ReadLine();
Это отлично работает в C#. Но я также хотел бы создать скрипт PowerShell для более быстрой разработки. Однако, поскольку StableNet запускает все сценарии PowerShell с параметром -noninteractive, я не могу использовать вызовы Read-Host для запроса встроенных параметров.
Итак, вопрос в том, есть ли у кого-нибудь хорошие идеи, как я могу добиться этих настроек встроенных параметров с помощью сценария Powershell и при этом заставить его работать как -неинтерактивный сценарий?
Я попробовал несколько вариантов, основанных на [System.Console]::OpenStandardInput().Read()
, но пока не добился успеха.
Поскольку агент мониторинга вызывает сценарии PowerShell с параметром -noninteractive, функция Read-Host недоступна. Я не контролирую, как программы вызывают сценарии, а только то, как оно передает свои параметры вызываемым сценариям. Возможно, этого вообще невозможно достичь, используя встроенную опцию с powerscript, но я подумал, что услышу, если у других есть какие-то идеи.
Используйте автоматическую переменную $input для доступа к вводу стандартного ввода, предоставляемому CLI PowerShell ( powershell.exe для Windows PowerShell, pwsh для PowerShell (Core) 7).
Например:
echo host1 user1 pass1 | powershell -noninteractive -c '$hostVar, $userVar, $passVar = @($input); [pscustomobject] @{ Host = $hostVar; User = $userVar; Pass = $passVar }'
Выход:
Host User Pass
---- ---- ----
host1 user1 pass1
Если вы не можете предоставить входные данные конвейера, но не можете избежать -NonInteractive
в вызове PowerShell CLI (что исключает использование Read-Host ), вы можете использовать System.Console.ReadLine, как и в C#, адаптированный к синтаксису PowerShell, то есть [Console]::ReadLine()
:
powershell -noninteractive -c '$hostVar = [Console]::ReadLine(); $userVar = [Console]::ReadLine(); $passVar = [Console]::ReadLine(); [pscustomobject] @{ Host = $hostVar; User = $userVar; Pass = $passVar }'
Насколько я понимаю, использование $input тоже не сработает. Программное обеспечение для мониторинга запускает PowerShell без передачи переменных, и изменить способ выполнения этого процесса невозможно. Таким образом, сценарий должен запуститься, а затем дождаться ввода + CR/LF для каждого параметра, ожидаемого сценарием. После предоставления всех параметров выполнение скрипта продолжается без перерыва. Поэтому мне нужно найти другой способ обойти «-noninteractive» режим, кроме использования read-host, но я начинаю думать, что с помощью -noninteractive невозможно обойти это ограничение.
@ThomasN, ты можешь использовать [Console]::ReadLine()
, на что -NonInteractive
не влияет - смотри мое обновление.
Блин, это работает! я почти уверен, что ранее пробовал вариант [Console]::ReadLine(), но, должно быть, я сделал что-то не так во время тестирования. Можно было обмануться, что это не работает, если вы не вызовете его с -noninteractive. Спасибо за помощь!
Стандартный ввод работает только в том случае, если вы передаете ввод в сценарий. Почему вы не можете использовать Read-Host? Откуда вы планируете получать входные данные, если не используете Read-Host?