PowerShell의 Clear-History가 이력을 클리어하지 않음
최근에 명령어를 실행해야 했는데 불행히도 명령줄에 비밀번호를 입력해야 했습니다.
그 후 "Clear"로 화면을 클리어했지만, 세션 이력에 문제가 되는 명령어가 표시되지 않도록 명령 이력을 클리어하고 싶었습니다.안타깝게도 Clear-History cmdlet은 설명서에서 주장하는 대로 실제로 수행되지 않는 것 같습니다. Clear-History를 실행하면 세션 기록에 전혀 영향을 주지 않는 것 같습니다.
팝업 기록 메뉴에 이전 명령어가 표시되고, 위쪽 키를 눌러 이전 명령어를 스크롤할 수 있습니다.다음은 문제를 보여주는 화면표시입니다.
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()
)
- PowerShell 자자자 ( ()
버전 1.2+에서는 (로 확인)
Get-Module PSReadLine
) 를 누르면, 양쪽의 콜이 실행되기 때문에, 수신중의 이력이 완전하게 클리어 됩니다.다만, 지금까지 축적된 이력을 클리어 하는 것은 아니기 때문에, 클리어 된 세션의 이력도, 향후의 세션에서 재등장합니다.
저장된 이력을 지우려면 저장된 세션이 저장되어 있는 파일을 수동으로 삭제해야 합니다( ).
(Get-PSReadlineOption).HistorySavePath
한 바와 같이, >>로 둘러싸인 것과Clear-SavedHistory
기능을 합니다.
CB.의 유익한 답변과 JVimes의 유용한 답변을 보완하기 위해:
PowerShell의 자체
Get-History
이력 메커니즘()은 호스트에 의존하지 않기 때문에 다소 의외로 호스트의 명령 이력도 개별적으로 클리어해야 합니다.콘솔 호스트 고유의 이력 기능에 대해서는, 다음과 같습니다.
-
doskey
스타일 이력 기능, 모듈 전PSReadline
PowerShell에 동봉되어 있습니다(아래 참조).- 저장된 이력은 없습니다. 이력은 현재 세션 기간 동안만 유지됩니다.
- Alt+F7 콘솔의 이력을 클리어하기 위해 사용해야 합니다.프로그래밍을 실행하는 (비활성화된) 방법은 없습니다.
cmd.exe
사용할 수 있는 콘솔 창doskey /reinstall
PS에서는 동작하지 않습니다). - CB.의 답변에는 이 키보드 조합을 시뮬레이트하는 방법이 나와 있습니다.기억해 주세요.이것은,
Clear-History
.
이 모듈은 Windows 10에서 PowerShell v5 및 v5.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-History
saved-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-History
sysloglet.
스크립트를 작성하려면 , 다음의 조작을 실시합니다.
[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
'programing' 카테고리의 다른 글
WPF: Items Control의 색상을 번갈아 사용하시겠습니까? (0) | 2023.04.14 |
---|---|
범위 내에서 부분 텍스트 찾기, 인덱스 반환 (0) | 2023.04.14 |
빠르고 슬림한 iPhone/iPad/iOS용 PDF 뷰어 - 힌트? (0) | 2023.04.14 |
python에서 nice 열 출력을 만듭니다. (0) | 2023.04.09 |
Swift에서 "포장되지 않은 가치"란 무엇입니까? (0) | 2023.04.09 |