Ответы:
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(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
В качестве альтернативы вы можете добавить его в качестве параметра скрипта для ввода как части выполнения скрипта
param(
[Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
[Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
)