about_PSConsoleHostReadLine — 콘솔 입력 읽기 방식을 내 손으로

about_PSConsoleHostReadLine — 콘솔 입력 읽기 방식을 내 손으로

콘솔 프롬프트에서 엔터나 탭을 누르기 전에 눌렀던 키 조합, PowerShell이 원래는 알 수 없어요. 이 문서는 그 문제를 푸는 PSConsoleHostReadLine 함수를 소개해요.

출처: about_PSConsoleHostReadLine - PowerShell (Microsoft Learn, Windows PowerShell 3.0 이상)

본문

한 줄 요약

콘솔 프롬프트에서 PowerShell이 입력을 읽어들이는 방식을 원하는 대로 바꾸는 법을 다루는 문서예요.

자세한 설명

Windows PowerShell 3.0부터는 PSConsoleHostReadLine이라는 이름의 함수를 직접 작성해서, 콘솔 입력이 처리되는 기본 방식을 덮어쓸 수 있어요.

이 함수는 PSReadLine 모듈에서 확장해서 쓰기도 해요.

예제

아래 예제는 메모장을 띄워서, 사용자가 작성한 텍스트 파일에서 입력을 받아와요.

function PSConsoleHostReadLine {
  $inputFile = Join-Path $Env:TEMP PSConsoleHostReadLine
  Set-Content $inputFile "PS > "

  # Notepad opens. Enter your command in it, save the file, and then exit.
  notepad $inputFile | Out-Null
  $userInput = Get-Content $inputFile
  $resultingCommand = $userInput.Replace("PS > ", "")
  $resultingCommand
}

메모장에서 명령을 입력하고 저장한 뒤 종료하면, 파일에 적힌 내용을 읽어 와서 PS > 부분만 떼어내 그 명령을 반환하는 흐름이에요. 주석에 적힌 대로 메모장을 열면 명령을 입력하고 파일을 저장한 뒤 종료하면 돼요.

참고 사항

기본적으로 PowerShell은 콘솔에서 입력을 읽을 때 Cooked Mode라고 불리는 방식을 사용해요. 이 모드에서는 Windows 콘솔 하위 시스템이 F7 메뉴 같은 모든 키 입력을 처리하죠.

EnterTab을 누르면, PowerShell은 그 순간까지 입력된 텍스트를 받아와요. 문제는 그 전에 눌렀던 Ctrl+R, Ctrl+A, Ctrl+E 같은 다른 키 조합은 전혀 알 수 없다는 점이에요.

Windows PowerShell 3.0에서는 PSConsoleHostReadLine 함수가 이 문제를 해결해요. 파워셸 콘솔 호스트에 PSConsoleHostReadLine이라는 이름의 함수를 정의해 두면, PowerShell은 기본 "Cooked Mode" 입력 방식 대신 그 함수를 호출해요.

더 알아보기