Запрос на ввод данных Пользователем в PowerShell



Я хочу запросить у пользователя ряд входных данных, включая пароль и имя файла.



У меня есть пример использования host.ui.prompt, что кажется разумным, но я не могу понять возвращение.



есть ли лучший способ получить пользовательский ввод в PowerShell?

4702   4  

4 ответов:

Read-Host это простой вариант для получения строки ввода от пользователя.

$name = Read-Host 'What is your username?'

чтобы скрыть пароли, вы можете использовать:

$pass = Read-Host 'What is your password?' -AsSecureString

чтобы преобразовать пароль в обычный текст:

[Runtime.InteropServices.Marshal]::PtrToStringAuto(
    [Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass))

что касается типа, возвращаемого $host.UI.Prompt(), если вы запустите код по ссылке, опубликованной в комментарии @Christian, вы можете узнать тип возврата, передав его в Get-Member (например, $results | gm). Результатом является словарь, где ключ имя FieldDescription объект, используемый в командной строке. Чтобы получить доступ к результату для первого приглашения в связанном примере, введите:$results['String Field'].

чтобы получить доступ к информации без вызова метода, оставьте скобки:

PS> $Host.UI.Prompt

MemberType          : Method
OverloadDefinitions : {System.Collections.Generic.Dictionary[string,psobject] Pr
                    ompt(string caption, string message, System.Collections.Ob
                    jectModel.Collection[System.Management.Automation.Host.Fie
                    ldDescription] descriptions)}
TypeNameOfValue     : System.Management.Automation.PSMethod
Value               : System.Collections.Generic.Dictionary[string,psobject] Pro
                    mpt(string caption, string message, System.Collections.Obj
                    ectModel.Collection[System.Management.Automation.Host.Fiel
                    dDescription] descriptions)
Name                : Prompt
IsInstance          : True

$Host.UI.Prompt.OverloadDefinitions даст вам определение(определения) метода. Каждое определение отображается как <Return Type> <Method Name>(<Parameters>).

использование привязки параметров, безусловно,путь сюда. Мало того, что это очень быстро писать (просто добавить [Parameter(Mandatory=$true)] выше ваших обязательных параметров), но это также единственный вариант, который вы не будете ненавидеть себя позже.

подробнее ниже:

[Console]::ReadLine явно запрещен FxCop правила для PowerShell. Зачем? Потому что он работает только в PowerShell.exe, а не PowerShell ISE, PowerGUI, так далее.

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

вы пытаетесь запросить параметры.

вы должны использовать [Parameter(Mandatory=$true)] атрибут и правильный ввод, чтобы запросить параметры.

если вы используете это на [SecureString], он запросит пароль. Если вы используете это на тип учетных данных, ([Management.Automation.PSCredential]), появится диалоговое окно учетные данные, если параметр отсутствует. Строка просто станет простым старым текстовым полем. Если вы добавляете HelpMessage в атрибут parameter (то есть [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]), то это станет подсказкой для приглашения.

поместите это в верхней части вашего сценария. Это приведет к тому, что скрипт запросит у пользователя пароль. Полученный пароль может быть использован в другом месте вашего скрипта через $pw.

   Param(
     [Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
     [SecureString]$password
   )

   $pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))

Если вы хотите отладить и увидеть значение пароля, который вы только что прочитали, используйте:

   write-host $pw

в качестве альтернативы, вы можете добавить его в качестве параметра скрипта для ввода как часть выполнения скрипта

 param(
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
      )

Comments

    Ничего не найдено.