암호와 파일 이름을 포함하여 일련의 입력을 요구하는 메시지를 표시하고 싶습니다.
나는 host.ui.prompt
합리적인 것으로 보이는 사용 예제를 가지고 있지만 반환을 이해할 수는 없습니다.
PowerShell에서 사용자 입력을 얻는 더 좋은 방법이 있습니까?
답변
Read-Host
사용자로부터 문자열 입력을 얻는 간단한 옵션입니다.
$name = Read-Host 'What is your username?'
비밀번호를 숨기려면 다음을 사용할 수 있습니다.
$pass = Read-Host 'What is your password?' -AsSecureString
비밀번호를 일반 텍스트로 변환하려면 다음을 수행하십시오.
[Runtime.InteropServices.Marshal]::PtrToStringAuto(
[Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass))
로 반환 된 유형은 $host.UI.Prompt()
@Christian의 설명에 게시 된 링크에서 코드를 실행하면 반환 유형을 Get-Member
(예 :)로 파이프하여 찾을 수 있습니다 $results | gm
. 결과는 키가 FieldDescription
프롬프트에 사용 된 오브젝트 의 이름 인 사전 입니다. 링크 된 예제에서 첫 번째 프롬프트의 결과에 액세스하려면 다음을 입력하십시오 $results['String Field']
..
메소드를 호출하지 않고 정보에 액세스하려면 괄호를 끄십시오.
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
메소드의 정의를 제공합니다. 각 정의는로 표시됩니다 <Return Type> <Method Name>(<Parameters>)
.
답변
매개 변수 바인딩을 사용하는 것이 분명합니다. 쓰기가 매우 빠를뿐만 아니라 ( [Parameter(Mandatory=$true)]
필수 매개 변수 위에 추가 하기 만하면 ) 나중에 자신을 미워하지 않는 유일한 옵션이기도합니다.
더 아래 :
[Console]::ReadLine
PowerShell 의 FxCop 규칙에 의해 명시 적으로 금지됩니다 . 왜? PowerShell ISE , PowerGUI 등이 아닌 PowerShell.exe에서만 작동하기 때문에
Read-Host 는 아주 간단히 나쁜 형태입니다. Read-Host는 제어 할 수없이 스크립트를 중지하여 사용자에게 프롬프트합니다. 즉, Read-Host를 사용하는 스크립트를 포함하는 다른 스크립트를 가질 수 없습니다.
매개 변수를 요청하려고합니다.
[Parameter(Mandatory=$true)]
매개 변수를 요청 하려면 속성과 올바른 입력을 사용해야합니다 .
에서 이것을 사용하면 [SecureString]
암호 필드를 묻는 메시지가 나타납니다. 자격 증명 유형 ( [Management.Automation.PSCredential]
) 에서이 옵션을 사용 하면 매개 변수가 없으면 자격 증명 대화 상자가 나타납니다. 문자열은 그냥 평범한 텍스트 상자가됩니다. 매개 변수 속성 (즉, [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]
)에 HelpMessage를 추가 하면 프롬프트에 대한 도움말 텍스트가됩니다.
답변
이것을 스크립트 상단에 놓습니다. 스크립트가 사용자에게 암호를 묻는 메시지를 표시합니다. 그런 다음 결과 비밀번호는 $ pw 를 통해 스크립트의 다른 곳에서 사용할 수 있습니다 .
Param(
[Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
[SecureString]$password
)
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
방금 읽은 비밀번호의 값을 디버그하고 보려면 다음을 사용하십시오.
write-host $pw
답변
대안으로, 스크립트 실행의 일부로 입력하기 위해 스크립트 매개 변수로 추가 할 수 있습니다.
param(
[Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
[Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
)