2012-11-06 29 views
17

Gần đây tôi đã phải chạy một lệnh mà tiếc là tôi yêu cầu nhập mật khẩu ngay trên dòng lệnh. Sau đó, tôi xóa màn hình của mình bằng "Clear", nhưng cũng muốn xóa lịch sử lệnh để lệnh vi phạm sẽ không hiển thị trong lịch sử phiên. Thật không may, cmdlet lịch sử rõ ràng dường như không thực sự làm những gì các yêu cầu tài liệu của nó - chạy lịch sử rõ ràng dường như không có bất kỳ tác động nào đến lịch sử phiên nào cả. Tôi vẫn có thể thấy các lệnh trước đó trong menu lịch sử bật lên và cuộn qua các lệnh cũ bằng cách bấm phím lên. Dưới đây là một Screengrab chứng minh vấn đề:Powershell Clear-History không rõ ràng Lịch sử

Powershell clear history failure

tôi đã xác minh với Get-Command rằng Clear-History được thực thi dự kiến ​​được xây dựng trong PowerShell cmdlet.

Tôi đã thử một vài biến thể, chẳng hạn như "Clear-History -count 10 -newest", tất cả đều không hiển thị bất kỳ hiệu ứng nào. Khi tôi chỉ định ID lịch sử chính xác, chẳng hạn như "Clear-History -id 3", tôi nhận được một lỗi như sau:

Clear-History : Cannot locate history for Id 3. 

Thậm chí nếu tôi có thể thấy lệnh # 3 trên màn hình. Bất kỳ đầu vào hoặc ý tưởng nào sẽ được đánh giá cao.

+0

Chỉ cần một lưu ý phụ, nhưng lịch sử bạn đang thực sự thanh toán bù trừ với 'Clear-History' là cái bạn nhìn thấy với' Get-History'. –

Trả lời

22

Để xóa màn hình Bật Lịch sử hiển thị (F7), bạn phải nhấn ALT + F7.

lịch sử này được quản lý bởi giao diện điều khiển bộ đệm không phải bằng PowerShell có lịch sử của ông clearable bởi clear-history cmdlet

đến kịch bản nó thử:

[system.reflection.assembly]::loadwithpartialname("System.Windows.Forms") 
[System.Windows.Forms.SendKeys]::Sendwait('%{F7 2}') 
+0

Hoang dã. Bất kỳ ý tưởng nếu chức năng đó có thể được nhân rộng lập trình để tôi có thể bí danh lịch sử rõ ràng để làm cả hai? – Fopedush

+0

@Fopedush chỉnh sửa trả lời của tôi để thêm mã cho kịch bản nó –

+0

Làm việc như một sự quyến rũ. Cảm ơn. – Fopedush

24

Trên Windows 10, lịch sử và các dữ liệu nhạy cảm hiển thị lại trong các phiên trong tương lai, ngay cả sau Alt + F7 và clear-history. Các solution I found là:

Remove-Item (Get-PSReadlineOption).HistorySavePath 

Sau đó, kết thúc phiên hiện tại hoặc xóa nó qua CB's answer

+0

Chỉ dành cho quản trị viên lười, đường dẫn mặc định cho tệp văn bản nơi các lệnh được lưu là: C: \ Users \ [tên người dùng] \ AppData \ Roaming \ Microsoft \ Windows \ PowerShell \ PSReadline Tệp được tạo lại thời gian bàn điều khiển được bắt đầu. Tôi đã đi xa như vậy để chạy Mô-đun PSReadline -Force, nhưng mô đun đã được thêm lại (và tệp lịch sử được tạo lại) khi tôi khởi động lại bàn điều khiển lần nữa. Có một số chức năng loại bỏ uber-module không? –

+1

Có thể khi họ gửi mô-đun w/PowerShell, họ thực hiện quá tốt việc nhập khẩu. Nếu lịch sử liên tục là tất cả những gì bạn muốn vô hiệu hóa (không phải tất cả psreadline [goodies] khác (https://github.com/lzybkr/PSReadLine)), nó [trông giống như] (https://github.com/lzybkr/ PSReadLine/issues/163) cách thêm 'Set-PSReadlineOption -HistorySaveStyle SaveNothing' vào hồ sơ của bạn. Để loại bỏ các mô-đun, có thể đặt lệnh đó trong hồ sơ của bạn sẽ làm việc "đủ tốt" cho bây giờ. – Vimes

+0

Mẹo tuyệt vời, nhưng để xóa lịch sử của phiên _current_, an toàn hơn để sử dụng '[Microsoft.PowerShell.PSConsoleReadLine] :: ClearHistory()' (sang một bên: gửi Alt + F7 không thực sự hoạt động ở tất cả trong 'PSReadline' v1 .1, là phiên bản được vận chuyển với Windows 10 (Alt + F7 đã được giới thiệu trong phiên bản v1.2) – mklement0

7

Để bổ sung CB.'s helpful answerJVimes's helpful answer:

  • cơ chế PowerShell của riêng lịch sử (Get-History, Clear-History) là độc lập máy chủ, đó là lý do - một số mũ đột ngột - bạn cũng cần xóa máy chủ lịch sử lệnh riêng biệt.

  • Đối với tính năng lịch sử riêng của host console của:

    • doskey kiểu tính năng lịch sử, trước khi mô-đun PSReadline vận chuyển với PowerShell (xem dưới đây):

      • no đã lưu lịch sử - một lịch sử y chỉ được giữ trong khoảng thời gian của phiên hiện tại.
      • Alt + F7 phải được sử dụng để xóa lịch sử của giao diện điều khiển, không có (hiển nhiên) cách chương trình để làm điều đó (trong một cửa sổ cmd.exe console bạn có thể sử dụng doskey /reinstall, nhưng điều đó không làm việc trong PS).
      • CB.'s answer cho bạn biết cách mô phỏng kết hợp bàn phím này; hãy nhớ: điều này phải được sử dụng trong ngoàiClear-History.
    • Module PSReadline đi kèm với PowerShell v5 trên Windows 10 và cũng sẽ xuất xưởng với Windows Server 2016; nó thay thế các tính năng biên tập dòng lệnh và chỉnh sửa doskey kiểu với chức năng phức tạp hơn; nó cũng có thể trang bị thêm phiên bản Windows cũ hơn/phiên bản PS (> = v3) với nó, sử dụng PowerShell Gallery (PSv3 và PSv4 trước tiên phải cài đặt PowerShellGet).

      • lệnh lịch sử bây giờ là lưu trên phiên, trong tập tin
        (Get-PSReadlineOption).HistorySavePath.
      • [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory() có thể được sử dụng để xóa lịch sử các hiện phiên của (lưu ý rằng v1.2 + cũng hỗ trợ Alt + F7 cho thanh toán bù trừ tương tác của lịch sử hiện
        • caveat:. Với PSReadline Kiểu lưu lịch sử mặc định, SaveIncrementally, bất kỳ lệnh nhạy cảm nào đã được lưu vào lúc bạn gọi [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory()sẽ xuất hiện lại trong tiếp theo phiên.
        • Cách duy nhất để xử lý này là loại bỏ các tập tin lưu lịch sử, như thể hiện trong JVimes's answer đó, tuy nhiên, luôn xóa sạch toàn bộ lịch sử.
        • NẾU bạn thiết lập hồ sơ cá nhân của bạn để gọi Set-PSReadlineOption -HistorySaveStyle SaveAtExit mỗi khi một phiên bắt đầu - các thiết lập apparenly KHÔNG "dính" bởi bản thân - bạn nên có thể nhận được ngay với chỉ gọi [Microsoft.PowerShell.PSConsoleReadLine]::ClearHistory() (ngoài Clear-History) mà không cần phải xóa tệp lịch sử đã lưu, trong trường hợp đó bạn sẽ không mất lịch sử đã lưu của mình từ các phiên trước đó. HOWEVER, AS OF v1.2, SaveAtExit là BROKEN ALTOGETHER - không có lịch sử nào được lưu ở tất cả; thấy https://github.com/lzybkr/PSReadLine/issues/262

sau đây chức năng tiên tiến bó tất cả các lệnh cần thiết để xóa lịch sử lệnh (cho cả PowerShell bản thân và giao diện điều khiển), cả hai cho doskey kiểu và PSReadline Các cửa sổ bảng điều khiển dành cho máy lẻ PowerShell:

Lưu ý:

  • Bởi vì nó (hiện tại) chỉ lựa chọn an toàn, PSReadline 's tập tin lưu lịch sử sẽ bị xóa là tốt, có nghĩa là toàn bộ lịch sử , bao gồm từ phiên trước đó, sẽ bị xóa.

  • Do đó, lời nhắc xác nhận được hiển thị theo mặc định.

<# 
# .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 

    } 

} 
Các vấn đề liên quan