The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何有效清空 PowerShell 中 PSReadline 的所有歷史紀錄

我的 如何打造一個華麗又實用的 PowerShell 命令輸入環境 文章 (影片在此) 幫助了不少人調整他手中的 PowerShell 命令列環境,其中有個功能是在打字的時候可以提示你先前打過的所有命令,非常方便且實用。但上周有同事問了我一個問題,他曾經在 PowerShell 中輸入過一些敏感資料,但是又找不到清除歷史紀錄的方法,問我該怎麼辦才好。這篇文章我將分享解決之道!

清除一個 PowerShell 工作階段 (Session) 的歷史紀錄

你每次開啟一個 PowerShell 視窗,就會建立一個工作階段 (Session),而每個工作階段都會維護一份輸入命令的歷史紀錄。

由於 Windows 10 開始,預設 PowerShell 會自動載入 PSReadLine 模組,大大強化了 PowerShell 命令列環境的命令輸入能力。你可以使用以下兩個命令管理輸入命令的歷史紀錄:

  1. 取得歷史紀錄 (Get-History)

    Get-History
    

    你也可以用內建的 h 別名 (Alias),直接輸入 h 就可以查詢歷史紀錄:

    h
    

    以下是顯示在畫面上的範例:

      Id CommandLine
      -- -----------
       1 dir
       2 cls
       3 Get-Alias
    
  2. 執行歷史命令 (Invoke-History)

    Invoke-History 3
    

    你也可以用內建的 r 別名 (Alias),直接輸入 r <Id> 就可以查詢歷史紀錄:

    r 3
    
  3. 清除歷史紀錄 (Clear-History)

    Clear-History
    

    另外有個 Alt-F7 鍵盤快速鍵,當你按下之後,並不會清除所有歷史紀錄,而是讓你不能用 ⬆ 方向鍵載入之前輸入過的命令!

清除所有 PowerShell 輸入過的命令歷史紀錄

其實管理一個工作階段的歷史紀錄不怎麼實用,因為 PSReadLine 預設會記憶你有史以來所有輸入過的命令,所以你下次重開 PowerShell 又可以搜尋到所有的歷史紀錄!事實上,你在 PowerShell 視窗輸入的所有命令,全部都記錄到一個文字檔中,你可以用以下命令查出該檔案的路徑:

(Get-PSReadlineOption).HistorySavePath

預設應該是這個路徑:

$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

我的這個檔案有 13,370 行,可以想像裡面包含了多少東西,但這個機制非常單純,這反而可以讓我想出更多種應用:

  1. 你可以手動清除所有不想保留在歷史紀錄中的命令

    例如你曾經輸入過的金鑰或密碼,都應該找出來清空。

  2. 你可以加入所有你希望未來可以隨時查詢到的命令

    有很多常見的命令,可以整理一遍,這樣之後要輸入命令就會變的非常實用! 👍

    不過 PSReadLine 有個 MaximumHistoryCount 選項設定,定義能載入的最大歷史命令的數量:

    (Get-PSReadLineOption).MaximumHistoryCount
    

    這個設定的預設值為 4,096 筆,因此當你開啟 PowerShell 之後,並不會真的載入 13,370 行命令,而是只會載入命令最後面的 4,096 行而已。若你要加入一些自己希望在未來可以查到的命令,建議直接加到該檔案的最後面!

相關連結