Я хочу предложить пользователю серию входов, включая пароль и имя файла.
У меня есть пример использования host.ui.prompt
, который кажется разумным, но я не могу понять возвращение.
Есть ли лучший способ получить пользовательский вклад в PowerShell?
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
] [ 2] (например, $ 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
даст вам определение (я) метода. Каждое определение отображается как < Тип возврата > < Имя метода > (< Параметры >)
.
Использование привязки параметров, безусловно, путь сюда. Мало того, что это очень быстро писать (просто добавьте [Параметр (обязательно = $ true)]
над вашими обязательными параметрами), но это также единственный вариант, который вы не будете ненавидеть себя позже.
Больше ниже:
[Консоль] :: ReadLine
явно запрещено правилами FxCop для PowerShell. Почему? Потому что он работает только в PowerShell.exe, а не в PowerShell ISE, PowerGUI и т. Д.
Читать-Хост, довольно просто, плохая форма. Read-Host неконтролируемо останавливает скрипт, чтобы вызвать пользователя, что означает, что у вас никогда не будет другого скрипта, который включает скрипт, который использует Read-Host.
Вы пытаетесь запросить параметры.
Вы должны использовать атрибут `[Parameter (Mandatory = $ true)] и правильный набор текста, чтобы запросить параметры.
Если вы используете это в [SecureString]
, это приведет к появлению поля пароля. Если вы используете это для типа Credential ([Management.Automation.PSCredential]
), появится диалоговое окно учетных данных, если параметр отсутствует. Строка просто станет простым старым текстовым полем. Если вы добавите HelpMessage к атрибуту параметра (то есть [Параметр (Mandatory = $ true, HelpMessage = 'Новые учетные данные пользователя')]
), то он станет текстом справки для приглашения.
Поместите это в верхней части вашего сценария. Это заставит скрипт запрашивать у пользователя пароль. Полученный пароль можно затем использовать в другом месте вашего скрипта через $ 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
)