Câu trả lời:
Read-Host
là một tùy chọn đơn giản để nhận đầu vào chuỗi từ người dùng.
$name = Read-Host 'What is your username?'
Để ẩn mật khẩu, bạn có thể sử dụng:
$pass = Read-Host 'What is your password?' -AsSecureString
Để chuyển đổi mật khẩu thành văn bản thuần túy:
[Runtime.InteropServices.Marshal]::PtrToStringAuto(
[Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass))
Đối với loại được trả về bởi $host.UI.Prompt()
, nếu bạn chạy mã tại liên kết được đăng trong bình luận của @ Christian, bạn có thể tìm ra loại trả về bằng cách chuyển nó tới Get-Member
(ví dụ $results | gm
:). Kết quả là một từ điển trong đó khóa là tên của một FieldDescription
đối tượng được sử dụng trong lời nhắc. Để truy cập kết quả cho lời nhắc đầu tiên trong ví dụ được liên kết, bạn sẽ gõ : $results['String Field']
.
Để truy cập thông tin mà không cần gọi một phương thức, hãy bỏ dấu ngoặc đơn:
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
sẽ cung cấp cho bạn định nghĩa của phương thức. Mỗi định nghĩa hiển thị như <Return Type> <Method Name>(<Parameters>)
.
Sử dụng ràng buộc tham số chắc chắn là cách để đi đến đây. Nó không chỉ rất nhanh để viết (chỉ cần thêm vào [Parameter(Mandatory=$true)]
trên các tham số bắt buộc của bạn), mà còn là lựa chọn duy nhất mà bạn sẽ không ghét bản thân mình sau này.
Thêm bên dưới:
[Console]::ReadLine
bị cấm rõ ràng bởi các quy tắc FxCop cho PowerShell. Tại sao? Bởi vì nó chỉ hoạt động trong PowerShell.exe, không phải PowerShell ISE , PowerGUI , v.v.
Read-Host là, khá đơn giản, hình thức xấu. Máy chủ đọc không thể kiểm soát dừng tập lệnh để nhắc người dùng, điều đó có nghĩa là bạn không bao giờ có thể có tập lệnh khác bao gồm tập lệnh sử dụng Máy chủ lưu trữ.
Bạn đang cố gắng yêu cầu thông số.
Bạn nên sử dụng [Parameter(Mandatory=$true)]
thuộc tính và gõ chính xác để yêu cầu các tham số.
Nếu bạn sử dụng điều này trên một [SecureString]
, nó sẽ nhắc cho một trường mật khẩu. Nếu bạn sử dụng điều này trên loại Thông tin xác thực, ( [Management.Automation.PSCredential]
), hộp thoại thông tin đăng nhập sẽ bật lên, nếu tham số không có ở đó. Một chuỗi sẽ chỉ trở thành một hộp văn bản cũ đơn giản. Nếu bạn thêm HelpMessage vào thuộc tính tham số (nghĩa là [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]
) , thì nó sẽ trở thành văn bản trợ giúp cho lời nhắc.
Read-Host
là "hình thức xấu" không được áp dụng. Hơn nữa, .ShouldProcess()
có những hạn chế Read-Host
không, chẳng hạn như chỉ giới hạn trong một vài câu trả lời. Tuy nhiên tôi đồng ý rằng điều đó .ShouldProcess()
tốt hơn khi áp dụng.
Đặt cái này ở đầu tập lệnh của bạn. Nó sẽ khiến tập lệnh nhắc người dùng nhập mật khẩu. Mật khẩu kết quả sau đó có thể được sử dụng ở nơi khác trong tập lệnh của bạn thông qua $ pw .
Param(
[Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
[SecureString]$password
)
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
Nếu bạn muốn gỡ lỗi và xem giá trị của mật khẩu bạn vừa đọc, hãy sử dụng:
write-host $pw