Как принимать встроенные входные данные в неинтерактивном сценарии PowerShell

Я пытаюсь собрать сценарий 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(), но пока не добился успеха.

Стандартный ввод работает только в том случае, если вы передаете ввод в сценарий. Почему вы не можете использовать Read-Host? Откуда вы планируете получать входные данные, если не используете Read-Host?

jdweng 03.07.2024 01:42

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

ThomasN 03.07.2024 17:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте автоматическую переменную $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 04.07.2024 19:04

@ThomasN, ты можешь использовать [Console]::ReadLine(), на что -NonInteractive не влияет - смотри мое обновление.

mklement0 04.07.2024 19:39

Блин, это работает! я почти уверен, что ранее пробовал вариант [Console]::ReadLine(), но, должно быть, я сделал что-то не так во время тестирования. Можно было обмануться, что это не работает, если вы не вызовете его с -noninteractive. Спасибо за помощь!

ThomasN 06.07.2024 00:03

Другие вопросы по теме