Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

PowerShell 명령 기록 저장, 검색, 관리 방법 총정리

기본적으로 Windows PowerShell(명령 프롬프트 포함)는 실행된 명령의 기록을 현재 PowerShell 세션에만 저장합니다. PowerShell 콘솔 창을 닫거나 컴퓨터를 재시작하면 입력했던 명령 기록은 어디에도 남지 않습니다. bash 셸과 비교하면 이는 상당한 단점입니다. 그러나 Windows 10(Windows Server 2016)부터 도입된 PowerShell 5.0부터는 콘솔에 입력된 모든 명령이 기본적으로 일반 텍스트 로그 파일에 저장되므로, 세션이 종료된 후에도 이전 명령을 손쉽게 불러올 수 있습니다.

PowerShell 5.0 이상에서의 명령 기록

복잡한 PowerShell 명령을 입력해 실행한 뒤 컴퓨터를 재시작하더라도, Windows 10 또는 Windows Server 2016 환경에서는 새 PowerShell 세션을 열고 위쪽 화살표 키를 누르면 마지막에 입력한 명령이 화면에 나타납니다. 위쪽 키를 계속 누르면 그 이전에 실행한 명령들이 차례로 표시됩니다. 이처럼 위쪽 화살표아래쪽 화살표 키를 이용해 명령 기록을 탐색하고, 이전에 입력한 명령을 다시 실행할 수 있습니다.

반면 이전 버전의 PowerShell에서는 세션이 종료되면 명령 기록이 사라집니다. Up/Down 키로 현재 세션의 기록만 조회할 수 있으며, Get-History cmdlet을 사용하면 세션 전체의 명령 목록을 확인할 수 있습니다.

현재 세션에서 실행한 명령의 상태와 시작·종료·소요 시간 등 상세 정보를 보려면 다음 명령을 사용합니다:

Get-History | Format-List -Property *

Windows 10의 PowerShell은 기본적으로 최근 4096개의 명령을 각 사용자 프로필 아래의 일반 텍스트 파일인 %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt에 저장합니다. 이 기록은 PowerShell과 PowerShell ISE에 대해 각각 별도로 관리됩니다.

실행 시간이 오래 걸리는 PowerShell 명령은 완료된 후에야 기록에 추가된다는 점도 참고하세요.

cmd.exe에서는 다음 명령으로 현재 세션의 명령 기록을 확인할 수 있습니다:

doskey /history

또한 F7 키를 누르면 cmd의 명령 기록을 검색할 수 있습니다.

PowerShell 명령 기록 검색 방법

위·아래 화살표 키로 전체 기록을 하나씩 넘기기 번거롭다면, CTRL+R(역방향 검색)과 CTRL+S(순방향 검색) 단축키로 명령 기록을 검색할 수 있습니다. 단축키를 누른 후 찾고자 하는 명령의 일부를 입력하면, 입력한 텍스트가 명령의 어느 위치에 있든 일치하는 항목을 찾아줍니다(F8 또는 Shift+F8 검색은 명령 시작 부분에서만 일치 항목을 찾는 것과 차이가 있습니다). 콘솔에는 검색 문자열에 해당하는 이전 명령이 표시되며, 일치하는 부분은 강조 표시됩니다.

찾은 명령이 원하는 것이 아니라면 CTRL+R/CTRL+S를 다시 눌러 다음 일치 항목으로 이동할 수 있습니다.

F8 키는 현재 명령줄에 입력된 텍스트로 시작하는 명령을 기록에서 찾아줍니다. 예를 들어 get-를 입력한 뒤 F8을 누르면 해당 텍스트로 시작하는 가장 최근 기록이 표시되고, 한 번 더 누르면 그다음 항목으로 이동합니다.

# 문자를 활용한 검색도 가능합니다. 예를 들어 Get-WMI로 시작하는 마지막 명령을 찾으려면 #get-wmi를 입력하고 Tab 키를 누르면 됩니다. 조건에 맞는 가장 최근 명령이 콘솔에 자동 완성됩니다.

이러한 명령 기록 기능은 클래식 Windows PowerShell과 새로운 PowerShell Core 모두에서 동일하게 작동합니다.

메모장으로 이전 명령 전체 목록을 열어 보려면 다음 명령을 실행합니다:

notepad (Get-PSReadLineOption | select -ExpandProperty HistorySavePath)

특정 키워드가 포함된 기록만 필터링해서 보려면 다음 명령을 사용합니다:

Get-History | Select-String -Pattern "Get-"

PSReadLine 모듈로 명령 기록 관리하기

PowerShell 5.0의 명령 기록 기능은 Windows Management Framework 자체에 내장된 것이 아니라, PowerShell 콘솔 기능을 크게 확장하는 PSReadLine 모듈을 기반으로 동작합니다. PSReadLine은 콘솔에서 구문 강조 표시를 담당하며, 마우스로 텍스트를 선택하고 CTRL+C/CTRL+V로 복사·붙여넣기 하는 기능도 제공합니다. Windows 10에서는 C:\Program Files\WindowsPowerShell\Modules\PSReadline 폴더에 위치하며, PowerShell 콘솔 시작 시 자동으로 로드됩니다.

다만 구버전 Windows용 독립형 PowerShell 5.0 설치 패키지에는 PSReadLine이 포함되어 있지 않습니다. 따라서 Windows 7/8.1 또는 Windows Server 2008R2/2012R2 환경에서 명령 기록 기능을 사용하려면 Windows Management Framework 5.1 설치와 함께, PackageManagement 모듈(구 OneGet)을 통해 온라인 리포지토리에서 PSReadLine을 설치해야 합니다:

Install-Module PSReadLine

명령 기록 관련 PSReadLine 함수와 각각에 할당된 키 목록은 다음 명령으로 확인할 수 있습니다:

Get-PSReadlineKeyHandler | ? {$_.function -like '*hist*'}

Key       Function                Description
---       --------                -----------
UpArrow   PreviousHistory         Replace the input with the previous item in the history
DownArrow NextHistory             Replace the input with the next item in the history
Ctrl+r    ReverseSearchHistory    Search history backwards interactively
Ctrl+s    ForwardSearchHistory    Search history forward interactively
Alt+F7    ClearHistory            Remove all items from the command line history (not PowerShell history)
F8        HistorySearchBackward   Search for the previous item in the history that starts with the current input - like NextHistory if the input is empty
Shift+F8  HistorySearchForward    Search for the next item in the history that starts with the current input - like NextHistory if the input is empty
Unbound   ViSearchHistoryBackward Starts a new seach backward in the history.
Unbound   BeginningOfHistory      Move to the first item in the history
Unbound   EndOfHistory            Move to the last item (the current input) in the history

명령 기록은 Get-PSReadlineOptionSet-PSReadlineOption cmdlet으로 구성할 수 있습니다. 현재 설정 값을 확인하려면 다음 명령을 실행합니다:

Get-PSReadlineOption | select HistoryNoDuplicates, MaximumHistoryCount, HistorySearchCursorMovesToEnd, HistorySearchCaseSensitive, HistorySavePath, HistorySaveStyle

주요 설정 항목은 다음과 같습니다:

  • HistoryNoDuplicates – 동일한 명령의 중복 저장 여부를 결정합니다.
  • MaximumHistoryCount – 저장되는 최대 명령 수입니다(기본값 4096개).
  • HistorySearchCursorMovesToEnd – 검색 시 커서를 명령 끝으로 이동할지 여부를 결정합니다.
  • HistorySearchCaseSensitive – 검색 시 대소문자 구분 여부를 결정합니다(기본적으로 구분하지 않음).
  • HistorySavePath – 명령 기록이 저장되는 파일의 경로를 표시합니다.
  • HistorySaveStyle – 명령 저장 방식을 결정합니다.
    • SaveIncrementally — 명령이 실행될 때마다 저장합니다(기본값).
    • SaveAtExit — PowerShell 콘솔이 종료될 때 기록을 저장합니다.
    • SaveNothing — 명령 기록 저장을 비활성화합니다.

Set-PSReadlineOption으로 설정을 변경할 수 있습니다. 예를 들어:

Set-PSReadlineOption -HistorySaveStyle SaveAtExit

로그 파일에 저장되는 명령 수를 늘리고 싶다면 다음 명령을 실행합니다:

Set-PSReadlineOption -MaximumHistoryCount 10000

이처럼 실행한 명령의 기록이 영구적으로 저장되는 점은 cmd 대신 PowerShell 콘솔을 선택해야 할 좋은 이유 중 하나입니다.

PowerShell 콘솔 명령 기록 삭제 방법

앞서 설명한 것처럼 PSReadLine 모듈은 모든 콘솔 명령을 텍스트 파일로 저장합니다. 하지만 관리자가 콘솔에 자격 증명, 암호, 주소, 개인 정보 같은 민감한 데이터를 입력하는 경우가 있습니다. 이런 정보가 일반 텍스트 파일로 남아 있으면 다른 관리자나 공격자에게 노출될 위험이 있으므로, 보안상의 이유로 명령 기록을 삭제하거나 저장 기능 자체를 비활성화해야 할 수 있습니다.

Clear-History cmdlet은 현재 PowerShell 세션의 메모리상 명령 기록만 삭제합니다. 즉, Get-History cmdlet이 표시하는 목록만 초기화되며 파일에 저장된 기록은 그대로 남습니다.

가장 최근 명령 하나만 삭제하려면:

Clear-History -count 1 -newest

특정 패턴이 포함된 명령만 일괄 삭제하려면:

Clear-History -CommandLine *set-ad*

파일에 저장된 기록까지 완전히 삭제하려면 PSReadLine이 기록을 저장하는 ConsoleHost_history.txt 파일 자체를 제거해야 합니다. 현재 기록 파일의 위치를 확인하고 바로 삭제하려면 다음 명령을 사용합니다:

Remove-Item (Get-PSReadlineOption).HistorySavePath

삭제 후에는 PowerShell 콘솔 창을 닫아 주세요.

앞으로도 명령 기록을 텍스트 파일에 저장하지 않으려면 다음 명령으로 저장 기능을 비활성화할 수 있습니다:

Set-PSReadlineOption -HistorySaveStyle SaveNothing

PowerShell 명령 기록 내보내기/가져오기 방법

여러 대의 컴퓨터에서 동일한 자주 쓰는 PowerShell 명령 세트를 사용하고 싶다면, 현재 컴퓨터의 명령 기록을 XML 파일로 내보낸 뒤 다른 컴퓨터로 가져올 수 있습니다. 물론 ConsoleHost_history.txt 파일을 대상 컴퓨터의 사용자 프로필로 복사하는 방법도 가능합니다.

현재 세션의 명령을 파일로 내보내려면 Export-Clixml cmdlet을 사용합니다:

Get-History | Export-Clixml -Path c:\ps\commands_hist.xml

파일에 저장된 기록을 다른 PoSh 세션(로컬 또는 원격 컴퓨터)으로 불러오려면:

Add-History -InputObject (Import-Clixml -Path c:\ps\commands_hist.xml)

세션이 종료될 때 명령 기록을 자동으로 파일로 내보내고 싶다면, 다음 스크립트를 PoSh 세션 종료 이벤트에 바인딩하면 됩니다(주의: PowerShell 창을 그냥 닫는 것이 아니라 반드시 exit 명령으로 세션을 종료해야 합니다):

$HistFile = Join-Path ([Environment]::GetFolderPath('UserProfile')) .ps_history
Register-EngineEvent PowerShell.Exiting -Action { Get-History | Export-Clixml $HistFile } | out-null
if (Test-path $HistFile) { Import-Clixml $HistFile | Add-History }