Yanıtlar:
Read-Host
bir kullanıcıdan dize girdisi almak için basit bir seçenektir.
$name = Read-Host 'What is your username?'
Şifreleri gizlemek için şunları kullanabilirsiniz:
$pass = Read-Host 'What is your password?' -AsSecureString
Parolayı düz metne dönüştürmek için:
[Runtime.InteropServices.Marshal]::PtrToStringAuto(
[Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass))
Döndürülen türe gelince $host.UI.Prompt()
, kodu @ Christian'ın yorumunda yayınlanan bağlantıda çalıştırırsanız, dönüş türünü Get-Member
(örneğin, $results | gm
) ile borulandırarak öğrenebilirsiniz . Sonuç, anahtarın FieldDescription
bilgi isteminde kullanılan bir nesnenin adı olduğu bir Sözlüktür. Bağlantılı örnekte ilk istemi sonucunu erişmek için şunları yazın: $results['String Field']
.
Bir yöntemi çağırmadan bilgilere erişmek için parantezleri kapalı bırakı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
size yöntemin tanımlarını verecektir. Her tanım olarak görüntülenir <Return Type> <Method Name>(<Parameters>)
.
Parametre bağlama kullanmak kesinlikle buraya gitmek için bir yoldur. Sadece yazmak çok hızlı değil (sadece [Parameter(Mandatory=$true)]
zorunlu parametrelerinizin üzerine ekleyin), aynı zamanda daha sonra kendinizden nefret etmeyeceğiniz tek seçenektir.
Aşağıda daha fazlası:
[Console]::ReadLine
PowerShell için FxCop kuralları tarafından açıkça yasaklanmıştır . Neden? Çünkü yalnızca PowerShell.exe'de çalışır, PowerShell ISE , PowerGUI vb.
Read-Host oldukça basit bir şekilde kötü bir formdur. Read-Host, komut istemini komut isteminden durdurarak kullanıcıdan sormasını sağlar, bu da Read-Host kullanan komut dosyasını içeren başka bir komut dosyasına sahip olamayacağınız anlamına gelir.
Parametreler istemeye çalışıyorsunuz.
[Parameter(Mandatory=$true)]
Parametreleri istemek için niteliği kullanmanız ve doğru yazmayı kullanmanız gerekir .
Bunu a'da kullanırsanız [SecureString]
, bir şifre alanı ister. Bunu Kimlik Bilgisi türünde ( [Management.Automation.PSCredential]
) kullanırsanız, parametre yoksa, kimlik bilgileri iletişim kutusu açılır. Bir dize sadece düz eski bir metin kutusu haline gelir. Parametre özniteliğine (yani [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]
) bir HelpMessage eklerseniz , bilgi istemi için yardım metni olur.
Read-Host
"kötü form" olma nedenleri geçerli değildir. Dahası, sadece birkaç cevapla sınırlı olmak gibi .ShouldProcess()
kısıtlamalara Read-Host
sahip değildir. Ancak .ShouldProcess()
uygulanabilir olduğunda daha iyi olduğunu kabul ediyorum .
Bunu betiğinizin en üstüne yerleştirin. Komut dosyasından kullanıcıdan parola istenmesine neden olur. Ortaya çıkan parola daha sonra $ pw aracılığıyla betiğinizin başka bir yerinde kullanılabilir .
Param(
[Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
[SecureString]$password
)
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
Hata ayıklamak ve az önce okuduğunuz parolanın değerini görmek istiyorsanız, şunu kullanın:
write-host $pw
Alternatif olarak, komut dosyasını yürütmenin bir parçası olarak girdi için komut dosyası parametresi olarak ekleyebilirsiniz
param(
[Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
[Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
)