Respostas:
Read-Host
é uma opção simples para obter entrada de string de um usuário.
$name = Read-Host 'What is your username?'
Para ocultar senhas, você pode usar:
$pass = Read-Host 'What is your password?' -AsSecureString
Para converter a senha em texto sem formatação:
[Runtime.InteropServices.Marshal]::PtrToStringAuto(
[Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass))
Quanto ao tipo retornado por $host.UI.Prompt()
, se você executar o código no link postado no comentário de @ Christian, poderá descobrir o tipo de retorno canalizando-o para Get-Member
(por exemplo, $results | gm
). O resultado é um dicionário onde a chave é o nome de um FieldDescription
objeto usado no prompt. Para acessar o resultado para o primeiro prompt no exemplo ligada você deverá digitar: $results['String Field']
.
Para acessar informações sem chamar um método, deixe os parênteses desativados:
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
fornecerá a (s) definição (ões) do método. Cada definição é exibida como <Return Type> <Method Name>(<Parameters>)
.
Usar a ligação de parâmetro é definitivamente o caminho a percorrer aqui. Não só é muito rápido escrever (basta adicionar [Parameter(Mandatory=$true)]
acima dos parâmetros obrigatórios), mas também é a única opção que você não se odiará mais tarde.
Mais abaixo:
[Console]::ReadLine
é explicitamente proibido pelas regras do FxCop para o PowerShell. Por quê? Porque ele funciona apenas no PowerShell.exe, não no PowerShell ISE , PowerGUI etc.
O Read-Host é, simplesmente, uma forma ruim. O Read-Host interrompe incontrolavelmente o script para avisar o usuário, o que significa que você nunca pode ter outro script que inclua o script que usa o Read-Host.
Você está tentando pedir parâmetros.
Você deve usar o [Parameter(Mandatory=$true)]
atributo e corrigir a digitação para solicitar os parâmetros.
Se você usar isso em um [SecureString]
, ele solicitará um campo de senha. Se você usar isso em um tipo de credencial, ( [Management.Automation.PSCredential]
), a caixa de diálogo de credenciais será exibida, se o parâmetro não estiver lá. Uma string se tornará uma caixa de texto antiga simples. Se você adicionar um HelpMessage ao atributo de parâmetro (ou seja, [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]
), ele se tornará um texto de ajuda para o prompt.
Read-Host
ser "má forma" não se aplicam. Além disso, .ShouldProcess()
possui restrições que Read-Host
não existem, como limitar-se a apenas algumas respostas. No entanto, concordo que .ShouldProcess()
é melhor, quando aplicável.
Coloque isso na parte superior do seu script. Isso fará com que o script solicite uma senha ao usuário. A senha resultante pode ser usada em outro lugar no seu script via $ pw .
Param(
[Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
[SecureString]$password
)
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
Se você deseja depurar e ver o valor da senha que você acabou de ler, use:
write-host $pw