PowerShell에서 사용자 입력을위한 프롬프트


209

암호와 파일 이름을 포함하여 일련의 입력을 요구하는 메시지를 표시하고 싶습니다.

나는 host.ui.prompt합리적인 것으로 보이는 사용 예제를 가지고 있지만 반환을 이해할 수는 없습니다.

PowerShell에서 사용자 입력을 얻는 더 좋은 방법이 있습니까?

답변:


333

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>).


감사합니다, @Rynant. 실제로 나의 주요 질문에 대답 한 유일한 사람이 된 것에 대한 대답을 받아 들였습니다! ;) 다른 모든 정보도 특히 도움이됩니다. 특히 PS에서 내 길을 모색하고 있습니다.
AJ.

문제 없습니다, @AJ. 메소드에 대한 정보를 얻는 또 다른 방법은 괄호를 사용하지 않는 것입니다. 내 대답에 예를 추가하겠습니다.
Rynant

3
참고로 사용자 이름과 비밀번호를 얻는 경우 Get-Credential을 사용할 수도 있습니다.
매트 리옹

75

매개 변수 바인딩을 사용하는 것이 분명합니다. 쓰기가 매우 빠를뿐만 아니라 ( [Parameter(Mandatory=$true)]필수 매개 변수 위에 추가 하기 만하면 ) 나중에 자신을 미워하지 않는 유일한 옵션이기도합니다.

더 아래 :

[Console]::ReadLinePowerShell 의 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를 추가 하면 프롬프트에 대한 도움말 텍스트가됩니다.


5
가장 유연하고 사용자 친화적 인 솔루션이지만 Rynant의 답변 과 같은 명확한 코드 예제가 없기 때문에 조언을 거의 무시했습니다 . 멋진 형식의 예제를 제공 할 수 있습니까?
Iain Samuel McLean Elder

4
"읽기-호스트는 아주 간단히 나쁜 형식입니다."... 누군가 매개 변수를 사용하여 스크립트를 호출하지 않았기 때문에 생략 된 입력을 조건부로 승인하기 위해 사용하지 않는 한. 팔.

2
아니요 : 여전히 나쁜 형태입니다. 따라서 매개 변수를 필수로 표시해야합니다.
시작 자동화

2
당신은 무엇을하면 원하는 대화 형 스크립트를 작성? 특정 조건이 충족되는 경우 사용자 입력 만 필요한 스크립트라고 가정하십시오. 예를 들어 스크립트가 SDK의 대상 디렉토리를 설정하는 경우 디렉토리가 이미 존재하는 경우 사용자가 디렉토리를 삭제하려고하는지 확인할 수 있습니다.
Jason Goemaat

6
user1499731이 좋은 지적이라고 생각합니다. 일부 정보가 표시되거나 다른 작업이 수행 된 후에 만 의미를 제공 할 수있는 사용자의 입력을 받아야하는 경우가 있습니다 . 이 경우 매개 변수를 사용할 수 없으며 여기에 Read-Host"잘못된 형식"으로 지정된 이유 는 적용되지 않습니다. 또한 몇 가지 답변으로 제한되지 않는 것과 같은 .ShouldProcess()제한 사항이 Read-Host있습니다. 그러나 .ShouldProcess()해당되는 경우 더 낫다는 데 동의합니다 .
LarsH

14

이것을 스크립트 상단에 놓습니다. 스크립트가 사용자에게 암호를 묻는 메시지를 표시합니다. 그런 다음 결과 비밀번호는 $ pw 를 통해 스크립트의 다른 곳에서 사용할 수 있습니다 .

   Param(
     [Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
     [SecureString]$password
   )

   $pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))

방금 읽은 비밀번호의 값을 디버그하고 보려면 다음을 사용하십시오.

   write-host $pw

3

대안으로, 스크립트 실행의 일부로 입력하기 위해 스크립트 매개 변수로 추가 할 수 있습니다.

 param(
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
      )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.