development

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

big-blog 2020. 5. 12. 19:09
반응형

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

As an alternative, you could add it as a script parameter for input as part of script execution

 param(
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
      )

참고URL : https://stackoverflow.com/questions/8184167/prompt-for-user-input-in-powershell

반응형