programing

PowerShell의 Clear-History가 이력을 클리어하지 않음

newstyles 2023. 4. 14. 21:22

PowerShell의 Clear-History가 이력을 클리어하지 않음

최근에 명령어를 실행해야 했는데 불행히도 명령줄에 비밀번호를 입력해야 했습니다.

그 후 "Clear"로 화면을 클리어했지만, 세션 이력에 문제가 되는 명령어가 표시되지 않도록 명령 이력을 클리어하고 싶었습니다.안타깝게도 Clear-History cmdlet은 설명서에서 주장하는 대로 실제로 수행되지 않는 것 같습니다. Clear-History를 실행하면 세션 기록에 전혀 영향을 주지 않는 것 같습니다.

팝업 기록 메뉴에 이전 명령어가 표시되고, 위쪽 키를 눌러 이전 명령어를 스크롤할 수 있습니다.다음은 문제를 보여주는 화면표시입니다.

PowerShell 이력 클리어 실패

Get-Command를 사용하여 Clear-History가 실제로 기본 제공 PowerShell cmdlet을 실행하고 있는지 확인했습니다.

"Clear-History - count 10 - newest"와 같은 몇 가지 변형을 시도했지만 모두 효과가 나타나지 않았습니다."Clear-History -id 3"과 같은 정확한 이력 ID를 지정하면 다음과 같은 오류가 나타납니다.

Clear-History : Cannot locate history for Id 3.

화면에 3번 명령어가 보여도.

Windows 10 에서는, Alt+F7 와 F7 이 끝난 후에도, 이력과 기밀 데이터는 향후의 세션에 재차 표시됩니다.clear-history이력은 다음 위치에서 찾을 수 있는 텍스트 파일에 저장되어 있습니다.

(Get-PSReadlineOption).HistorySavePath

해당 파일에서 문제의 행을 삭제하고 현재 세션을 종료합니다(또는 CB의 응답으로 클리어합니다).

요청을 업투표하여 기록을 일시적으로 비활성화할 수 있습니다.

dr;dr

  • 다음가지 이력을 클리어해야 합니다.

    • PowerShell 자자자 ( ()Clear-History)
    • 콘솔에서는, 「」( 「」)의 「」의 「」PSReadLine에서 명령줄 편집에 기본적으로 사용되는 모듈(PowerShell v5+)[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory())
  • 버전 1.2+에서는 (로 확인)Get-Module PSReadLine) 를 누르면, 양쪽의 콜이 실행되기 때문에, 수신중의 이력이 완전하게 클리어 됩니다.

    • 다만, 지금까지 축적된 이력을 클리어 하는 것은 아니기 때문에, 클리어 된 세션의 이력도, 향후의 세션에서 재등장합니다.

    • 저장된 이력을 지우려면 저장된 세션이 저장되어 있는 파일을 수동으로 삭제해야 합니다( ).(Get-PSReadlineOption).HistorySavePath한 바와 같이, >>로 둘러싸인 것과 Clear-SavedHistory기능을 합니다.


CB.의 유익한 답변과 JVimes의 유용한 답변을 보완하기 위해:

  • PowerShell의 자체 Get-History이력 메커니즘()호스트에 의존하지 않기 때문에 다소 의외로 호스트명령 이력 개별적으로 클리어해야 합니다.

  • 콘솔 호스트 고유의 이력 기능에 대해서는, 다음과 같습니다.

    • - doskey스타일 이력 기능, 모듈 전PSReadlinePowerShell에 동봉되어 있습니다(아래 참조).

      • 저장된 이력은 없습니다. 이력은 현재 세션 기간 동안만 유지됩니다.
      • Alt+F7 콘솔의 이력을 클리어하기 위해 사용해야 합니다.프로그래밍을 실행하는 (비활성화된) 방법은 없습니다.cmd.exe사용할 수 있는 콘솔 창doskey /reinstallPS에서는 동작하지 않습니다).
      • CB.의 답변에는 이 키보드 조합을 시뮬레이트하는 방법이 나와 있습니다.기억해 주세요.이것은, Clear-History.
    • 모듈은 Windows 10에서 PowerShell v5v5.1과 함께 제공되며 Windows Server 2016에도 함께 제공됩니다.또한 크로스 플랫폼 파워 셸( 코어) v7+ 에디션) v7+ 에디션과 명령줄(Core)과 명령 기능 및 명령 기능을 사용할 수 있습니다.PowerShell 갤러리(PSV3 및 PSV4를 사용하여 먼저 PowerShellet)를 설치해야 합니다.

      • 명령어 이력여러 세션에 걸쳐 파일에 저장됩니다.
        를 클릭합니다(Get-PSReadlineOption).HistorySavePath.
      • [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory() 현재 세션의 이력을 클리어하기 위해 사용할 수 있습니다(v1.2+는 현재 이력의 대화식 클리어도 지원합니다).
        • 경고: 포함PSReadline의 기본 이력 저장 스타일,SaveIncrementally중요한 명령어는 이미 저장되어 있습니다.[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()다음 세션에서 다시 표시됩니다.
        • 이 문제를 해결하는 유일한 방법은 저장된 이력 파일을 삭제하는 것입니다. , JVimes의 답변에서 알 수 있듯이 이 파일은 항상 전체 이력을 지웁니다.
        • 호출하도록 프로파일을 설정한 경우Set-PSReadlineOption -HistorySaveStyle SaveAtExit세션이 시작될 때마다 - 설정이 자동으로 "고정되지 않음" - 호출만 해도 벗어날 수 있습니다.[Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()(에 가세해Clear-Historysaved-history 파일을 삭제할 필요도 없습니다.이 경우 이전 세션에서 저장된 이력이 손실되지 않습니다.단,문서의 최신 버전인 버전 2.1.0은 모두 깨졌습니다.이력은 전혀 보존되지 않습니다.https://github.com/lzybkr/PSReadLine/issues/262 를 참조해 주세요.

다음 고급 기능은 PowerShell 콘솔 창과 -module PowerShell 콘솔 모두에서 명령 기록을 지우는필요한 모든 명령을 번들합니다.

주의:

  • 유일한 옵션이기 에, 「」(「」)은 「」PSReadline의 saved-history 파일도 삭제됩니다.이는 이전 세션을 포함한 전체 이력이 클리어됨을 의미합니다.

  • 따라서 기본적으로 확인 프롬프트가 표시됩니다.

<#
# .SYNOPSIS
#  Clears the command history, including the saved-to-file history, if applicable.
#>
function Clear-SavedHistory {
  [CmdletBinding(ConfirmImpact='High', SupportsShouldProcess)]
  param(    
  )

  # Debugging: For testing you can simulate not having PSReadline loaded with
  #            Remove-Module PSReadline -Force
  $havePSReadline = ($null -ne (Get-Module -EA SilentlyContinue PSReadline))

  Write-Verbose "PSReadline present: $havePSReadline"

  $target = if ($havePSReadline) { "entire command history, including from previous sessions" } else { "command history" } 

  if (-not $pscmdlet.ShouldProcess($target))
  {
        return
  }

  if ($havePSReadline) {
    
    Clear-Host

    # Remove PSReadline's saved-history file.
    if (Test-Path (Get-PSReadlineOption).HistorySavePath) { 
      # Abort, if the file for some reason cannot be removed.
      Remove-Item -EA Stop (Get-PSReadlineOption).HistorySavePath 
      # To be safe, we recreate the file (empty). 
      $null = New-Item -Type File -Path (Get-PSReadlineOption).HistorySavePath
    }

    # Clear PowerShell's own history 
    Clear-History

    # Clear PSReadline's *session* history.
    # General caveat (doesn't apply here, because we're removing the saved-history file):
    #   * By default (-HistorySaveStyle SaveIncrementally), if you use
    #    [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory(), any sensitive
    #    commands *have already been saved to the history*, so they'll *reappear in the next session*. 
    #   * Placing `Set-PSReadlineOption -HistorySaveStyle SaveAtExit` in your profile 
    #     SHOULD help that, but as of PSReadline v1.2, this option is BROKEN (saves nothing). 
    [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()

  } else { # Without PSReadline, we only have a *session* history.

    Clear-Host
    
    # Clear the doskey library's buffer, used pre-PSReadline. 
    # !! Unfortunately, this requires sending key combination Alt+F7.
    # Thanks, https://stackoverflow.com/a/13257933/45375
    $null = [system.reflection.assembly]::loadwithpartialname("System.Windows.Forms")
    [System.Windows.Forms.SendKeys]::Sendwait('%{F7 2}')

    # Clear PowerShell's own history 
    Clear-History

  }

}

온스크린 디스플레이 기록()F7을 지우려면 + 키를 눌러야 합니다.

은 PowerShell에 에 의해 됩니다.Clear-Historysysloglet.

스크립트를 작성하려면 , 다음의 조작을 실시합니다.

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[System.Windows.Forms.SendKeys]::Sendwait('%{F7 2}')

현시점에서는 psreadline을 삭제하는 방법밖에 없습니다.txt 텍스트는 자동 Job을 실행하여 정기적으로 폴더에서 가져옵니다.명령어에 대한 파일 경로는 @ 입니다.

PS C:\Users\{{user}}\appdata\roaming\microsoft\windows\powershell\psreadline>

은 「」입니다.history.txt

@mklement0의 최선의 답변에 의해, 나는 결국 내 안에 배치되어 있는 다음 함수를 갖게 되었다.$PROFILE

다른 세션은 신경 안 써 그냥 그 멍청한 역사가 지워지길 바랄 뿐이야

name cmdlet 름름Clear-History가능한 많이 혼란스럽게 만들죠

# it's a default alias for Get-History cmdlet
Remove-Alias history

# Usage: history      - just print the history, same as call Get-History
# Usage: history -c   - really clears the history
function history {
    param (
        # Clears history
        [Parameter()]
        [Alias("c")]
        [Switch]
        $Clear
    )

    if ($Clear){
        Clear-History
        [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()
        return
    }

    Get-History
}

Prediction(예측)에서 선택한 기록 항목을 제거하는 다른 방법이 있습니다.PSReadLine 호에서 이 우아한 방법을 찾았습니다.

Set-PSReadLineKeyHandler -Key Shift+Delete `
    -BriefDescription RemoveFromHistory `
    -LongDescription "Removes the content of the current line from history" `
    -ScriptBlock {
    param($key, $arg)

    $line = $null
    $cursor = $null
    [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor)

    $toRemove = [Regex]::Escape(($line -replace "\n", "```n"))
    $history = Get-Content (Get-PSReadLineOption).HistorySavePath -Raw
    $history = $history -replace "(?m)^$toRemove\r\n", ""
    Set-Content (Get-PSReadLineOption).HistorySavePath $history
}

언급URL : https://stackoverflow.com/questions/13257775/powershells-clear-history-doesnt-clear-history