Risposte:
Read-Host
è una semplice opzione per ottenere l'input della stringa da un utente.
$name = Read-Host 'What is your username?'
Per nascondere le password puoi usare:
$pass = Read-Host 'What is your password?' -AsSecureString
Per convertire la password in testo semplice:
[Runtime.InteropServices.Marshal]::PtrToStringAuto(
[Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass))
Per quanto riguarda il tipo restituito da $host.UI.Prompt()
, se si esegue il codice sul collegamento pubblicato nel commento di @ Christian, è possibile scoprire il tipo restituito eseguendo il piping su Get-Member
(ad esempio $results | gm
). Il risultato è un dizionario in cui la chiave è il nome di un FieldDescription
oggetto utilizzato nel prompt. Per accedere al risultato del primo prompt nell'esempio collegato è necessario digitare: $results['String Field']
.
Per accedere alle informazioni senza invocare un metodo, lasciare le parentesi spente:
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
ti darà la definizione del metodo. Ogni definizione viene visualizzata come <Return Type> <Method Name>(<Parameters>)
.
L'uso dell'associazione di parametri è sicuramente la strada da percorrere qui. Non solo è molto veloce scrivere (basta aggiungere [Parameter(Mandatory=$true)]
sopra i parametri obbligatori), ma è anche l'unica opzione per cui non ti odierai più tardi.
Più sotto:
[Console]::ReadLine
è esplicitamente vietato dalle regole di FxCop per PowerShell. Perché? Perché funziona solo in PowerShell.exe, non in PowerShell ISE , PowerGUI , ecc.
Read-Host è, semplicemente, una pessima forma. Read-Host interrompe in modo incontrollato lo script per richiedere all'utente, il che significa che non è mai possibile avere un altro script che includa lo script che utilizza Read-Host.
Stai cercando di chiedere parametri.
È necessario utilizzare l' [Parameter(Mandatory=$true)]
attributo e la digitazione corretta per richiedere i parametri.
Se lo usi su a [SecureString]
, verrà richiesto un campo password. Se lo usi su un tipo di credenziale, ( [Management.Automation.PSCredential]
), verrà visualizzata la finestra di dialogo delle credenziali, se il parametro non è presente. Una stringa diventerà semplicemente una vecchia casella di testo. Se aggiungi un HelpMessage all'attributo parametro (ovvero, [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]
) diventerà il testo di aiuto per il prompt.
Read-Host
essere "cattiva forma" non si applicano. Inoltre, .ShouldProcess()
ha delle restrizioni che Read-Host
non lo sono, come essere limitato a poche risposte. Tuttavia sono d'accordo che .ShouldProcess()
è meglio, quando è applicabile.
Posizionalo nella parte superiore della tua sceneggiatura. Lo script richiederà all'utente una password. La password risultante può quindi essere utilizzata altrove nello script tramite $ pw .
Param(
[Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
[SecureString]$password
)
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
Se desideri eseguire il debug e visualizzare il valore della password che hai appena letto, utilizza:
write-host $pw