Відповіді:
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()
, якщо ви запустите код за посиланням, розміщеним у коментарі @ Крістіана, ви можете дізнатися тип повернення, перейшовши на нього 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.
Ви намагаєтеся запитати параметри.
Вам слід скористатись [Parameter(Mandatory=$true)]
атрибутом та правильно вводити текст, щоб запитати про параметри.
Якщо ви використовуєте це на a [SecureString]
, воно запропонує поле для введення пароля. Якщо ви користуєтесь цим типом Повноваження, ( [Management.Automation.PSCredential]
), діалогове вікно облікових даних з'явиться, якщо параметр відсутній. Рядок просто стане звичайним старим текстовим полем. Якщо додати параметр HelpMessage до атрибута параметра (тобто [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]
), він стане довідковим текстом для підказки.
Read-Host
"неправильної форми", не застосовуються. Більше того, .ShouldProcess()
є обмеження, яких Read-Host
немає, наприклад обмежуючись лише кількома відповідями. Однак я згоден, що .ShouldProcess()
краще, коли це застосовується.
Розмістіть це вгорі вашого сценарію. Це призведе до того, що сценарій запропонує користувачеві ввести пароль. Отриманий пароль потім може бути використаний в іншому місці вашого сценарію через $ pw .
Param(
[Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
[SecureString]$password
)
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
Якщо ви хочете налагоджувати і бачити значення пароля, який ви тільки що прочитали, скористайтеся:
write-host $pw