Jawaban:
Read-Host
adalah opsi sederhana untuk mendapatkan input string dari pengguna.
$name = Read-Host 'What is your username?'
Untuk menyembunyikan kata sandi, Anda dapat menggunakan:
$pass = Read-Host 'What is your password?' -AsSecureString
Untuk mengonversi kata sandi menjadi teks biasa:
[Runtime.InteropServices.Marshal]::PtrToStringAuto(
[Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass))
Adapun jenis yang dikembalikan oleh $host.UI.Prompt()
, jika Anda menjalankan kode pada tautan yang diposting di komentar @ Christian, Anda dapat mengetahui jenis pengembalian dengan memipangnya ke Get-Member
(misalnya, $results | gm
). Hasilnya adalah Kamus di mana kuncinya adalah nama FieldDescription
objek yang digunakan dalam prompt. Untuk mengakses hasilnya untuk pertama prompt dalam contoh terkait Anda akan ketik: $results['String Field']
.
Untuk mengakses informasi tanpa menggunakan metode, biarkan tanda kurung mati:
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
akan memberi Anda definisi metode. Setiap definisi ditampilkan sebagai <Return Type> <Method Name>(<Parameters>)
.
Menggunakan pengikatan parameter jelas merupakan cara untuk pergi ke sini. Tidak hanya itu sangat cepat untuk menulis (cukup tambahkan di [Parameter(Mandatory=$true)]
atas parameter wajib Anda), tetapi juga satu-satunya pilihan bahwa Anda tidak akan membenci diri sendiri untuk nanti.
Lebih banyak di bawah ini:
[Console]::ReadLine
secara eksplisit dilarang oleh aturan FxCop untuk PowerShell. Mengapa? Karena hanya berfungsi di PowerShell.exe, bukan PowerShell ISE , PowerGUI , dll.
Read-Host adalah, cukup sederhana, bentuk yang buruk. Read-Host menghentikan script untuk meminta pengguna, yang berarti Anda tidak akan pernah memiliki script lain yang menyertakan script yang menggunakan Read-Host.
Anda mencoba meminta parameter.
Anda harus menggunakan [Parameter(Mandatory=$true)]
atribut, dan mengoreksi pengetikan, untuk meminta parameter.
Jika Anda menggunakan ini pada [SecureString]
, itu akan meminta bidang kata sandi. Jika Anda menggunakan ini pada tipe Kredensial, ( [Management.Automation.PSCredential]
), dialog kredensial akan muncul, jika parameter tidak ada. Sebuah string hanya akan menjadi kotak teks biasa. Jika Anda menambahkan HelpMessage ke atribut parameter (yaitu, [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]
) maka itu akan menjadi teks bantuan untuk prompt.
Read-Host
sebagai "bentuk buruk" tidak berlaku. Selain itu, .ShouldProcess()
memiliki batasan yang Read-Host
tidak, seperti dibatasi hanya pada beberapa jawaban. Namun saya setuju itu .ShouldProcess()
lebih baik, ketika itu berlaku.
Tempatkan ini di bagian atas skrip Anda. Ini akan menyebabkan script meminta kata sandi kepada pengguna. Kata sandi yang dihasilkan kemudian dapat digunakan di tempat lain dalam skrip Anda melalui $ pw .
Param(
[Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
[SecureString]$password
)
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
Jika Anda ingin men-debug dan melihat nilai kata sandi yang baru saja Anda baca, gunakan:
write-host $pw