Chcę zapytać użytkownika o szereg danych wejściowych, w tym hasło i nazwę pliku.
Mam przykład użycia host.ui.prompt
, co wydaje się rozsądne, ale nie rozumiem zwrotu.
Czy jest lepszy sposób na uzyskanie wkładu użytkownika w PowerShell?
źródło
Chcę zapytać użytkownika o szereg danych wejściowych, w tym hasło i nazwę pliku.
Mam przykład użycia host.ui.prompt
, co wydaje się rozsądne, ale nie rozumiem zwrotu.
Czy jest lepszy sposób na uzyskanie wkładu użytkownika w PowerShell?
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ą FieldDescription
obiektu 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.OverloadDefinitions
poda 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]::ReadLine
jest 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.źródło
Read-Host
„złej formy” nie mają zastosowania. Co więcej,.ShouldProcess()
ma ograniczenia, którychRead-Host
nie 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 .
Jeśli chcesz debugować i zobaczyć wartość właśnie przeczytanego hasła, użyj:
źródło
Alternatywnie możesz dodać go jako parametr skryptu do wprowadzania w ramach wykonywania skryptu
źródło