Запрос на ввод данных Пользователем в PowerShell
Я хочу запросить у пользователя ряд входных данных, включая пароль и имя файла.
У меня есть пример использования host.ui.prompt, что кажется разумным, но я не могу понять возвращение.
есть ли лучший способ получить пользовательский ввод в PowerShell?
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