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

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

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


답변

이것을 스크립트 상단에 놓습니다. 스크립트가 사용자에게 암호를 묻는 메시지를 표시합니다. 그런 다음 결과 비밀번호는 $ 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
      )


답변