Odpowiedzi:
Read-Host jest prostą opcją do uzyskiwania danych wejściowych od użytkownika.
$name = Read-Host 'What is your username?'
Aby ukryć hasła, możesz użyć:
$pass = Read-Host 'What is your password?' -AsSecureString
Aby przekonwertować hasło na zwykły tekst:
[Runtime.InteropServices.Marshal]::PtrToStringAuto(
[Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass))
Jeśli chodzi o typ zwracany przez $host.UI.Prompt(), jeśli uruchomisz kod pod linkiem opublikowanym w komentarzu @ Christiana, możesz znaleźć typ zwrotu, przesyłając go do Get-Member(na przykład $results | gm). Wynikiem jest Słownik, w którym klucz jest nazwą FieldDescriptionobiektu użytego w pytaniu. Aby uzyskać dostęp do wyniku pierwszego monitu w połączonym przykładzie, należy wpisać:$results['String Field'] .
Aby uzyskać dostęp do informacji bez wywoływania metody, pozostaw nawiasy wyłączone:
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.OverloadDefinitionspoda definicję metody. Każda definicja jest wyświetlana jako <Return Type> <Method Name>(<Parameters>).
Korzystanie z wiązania parametrów jest zdecydowanie najlepszym sposobem na przejście tutaj. Pisanie jest nie tylko bardzo szybkie (wystarczy dodać[Parameter(Mandatory=$true)] powyżej swoich obowiązkowych parametrów), ale jest to również jedyna opcja, której nie będziesz nienawidzić później.
Więcej poniżej:
[Console]::ReadLinejest wyraźnie zabronione przez reguły FxCop dla PowerShell. Czemu? Ponieważ działa tylko w PowerShell.exe, a nie PowerShell ISE , PowerGUI itp.
Read-Host to po prostu zła forma. Read-Host w niekontrolowany sposób zatrzymuje skrypt, aby monitować użytkownika, co oznacza, że nigdy nie możesz mieć innego skryptu zawierającego skrypt korzystający z Read-Host.
Próbujesz zapytać o parametry.
Powinieneś użyć [Parameter(Mandatory=$true)] atrybutu i poprawić pisanie, aby zapytać o parametry.
Jeśli użyjesz tego w polu [SecureString], pojawi się monit o podanie hasła. Jeśli użyjesz tego typu poświadczenia ( [Management.Automation.PSCredential]), pojawi się okno dialogowe poświadczeń, jeśli nie ma tam parametru. Ciąg stanie się zwykłym starym polem tekstowym. Jeśli dodasz HelpMessage do atrybutu parametru (to znaczy [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]), stanie się on tekstem pomocy dla monitu.
Read-Host„złej formy” nie mają zastosowania. Co więcej, .ShouldProcess()ma ograniczenia, których Read-Hostnie ma, na przykład ogranicza się do kilku odpowiedzi. Zgadzam się jednak, że .ShouldProcess()lepiej, jeśli ma to zastosowanie.
Umieść to na górze skryptu. Spowoduje to, że skrypt wyświetli monit o podanie hasła. Wynikowe hasło można następnie wykorzystać w innym miejscu skryptu za pomocą $ pw .
Param(
[Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
[SecureString]$password
)
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
Jeśli chcesz debugować i zobaczyć wartość właśnie przeczytanego hasła, użyj:
write-host $pw
Alternatywnie możesz dodać go jako parametr skryptu do wprowadzania w ramach wykonywania skryptu
param(
[Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
[Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
)