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ą 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.
Read-Host
„złej formy” nie mają zastosowania. Co więcej, .ShouldProcess()
ma ograniczenia, których Read-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 .
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
)