Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Máy Chủ Windows

Lịch sử lệnh trước đó trong PowerShell Console

Theo mặc định, Windows PowerShell (cũng như command prompt) chỉ lưu lịch sử các lệnh đã thực thi trong phiên PowerShell hiện tại. Khi bạn đóng cửa sổ PowerShell console hoặc khởi động lại máy tính, lịch sử các lệnh PowerShell bạn gõ không được lưu ở đâu. So với bash, đây là một nhược điểm đáng kể. Kể từ PowerShell 5.0 được giới thiệu trong Windows 10 (Windows Server 2016), tất cả các lệnh nhập vào console PS hiện được lưu vào file log văn bản thuần túy theo mặc định.

Lịch sử lệnh trong PowerShell 5.0 và mới hơn

Giả sử bạn đã gõ và thực thi một số lệnh PowerShell phức tạp. Trong Windows 10 và Windows Server 2016, ngay cả sau khi khởi động lại máy tính, bạn có thể mở phiên PowerShell mới và nhấn phím mũi tên lên. Lệnh cuối cùng bạn nhập sẽ hiển thị trên màn hình. Nếu bạn tiếp tục nhấn phím "lên", bạn sẽ thấy tất cả các lệnh đã thực thi trước đó. Vì vậy, sử dụng phím "Up arrow" và "Down arrow" bạn có thể cuộn qua lịch sử lệnh PoSh và thực thi lại các lệnh đã gõ trước đó.

Trong các phiên bản PowerShell trước đó, lịch sử lệnh trong phiên hiện tại không được lưu sau khi đóng. Sử dụng phím up/down, bạn chỉ có thể cuộn qua lịch sử lệnh của phiên PS hiện tại hoặc liệt kê toàn bộ lịch sử lệnh bằng cmdlet Get-History.

Bạn có thể hiển thị thông tin chi tiết hơn về các lệnh đã thực thi trước đó trong phiên PowerShell hiện tại, bao gồm trạng thái lệnh và thời gian bắt đầu/kết thúc/thời lượng:

Get-History | Format-List -Property *

Lịch sử lệnh trước đó trong PowerShell Console

Theo mặc định, PowerShell trong Windows 10 lưu 4096 lệnh cuối cùng được lưu trong file văn bản thuần túy nằm trong hồ sơ của mỗi người dùng %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt.

Lịch sử được lưu riêng biệt cho PowerShell và PowerShell ISE.

Lịch sử lệnh trước đó trong PowerShell Console

Nếu một lệnh PowerShell mất nhiều thời gian để thực thi, bạn chỉ thấy nó trong lịch sử lệnh khi nó hoàn thành.

Trong cmd.exe, bạn có thể hiển thị lịch sử lệnh trong phiên hiện tại với:

doskey /history

Phím F7 được dùng để tìm kiếm trong lịch sử cmd.

Lịch sử lệnh trước đó trong PowerShell Console

Cách tìm kiếm lịch sử lệnh PowerShell?

Nếu bạn không muốn cuộn qua toàn bộ lịch sử lệnh PowerShell bằng mũi tên lên/xuống, bạn có thể tìm kiếm lịch sử lệnh bằng phím tắt CTRL+R (tìm kiếm ngược) và CTRL+S (tìm kiếm xuôi). Nhấn tổ hợp phím và bắt đầu gõ một phần của lệnh bạn muốn tìm trong các lệnh đã thực thi trước đó. Văn bản bạn nhập sẽ được tìm trong lịch sử lệnh ở bất kỳ vị trí nào (khác với tìm kiếm trong PowerShell dùng F8 hoặc Shift+F8, chỉ cho phép tìm khớp từ đầu dòng). PowerShell console sẽ hiển thị lệnh trước đó tương ứng với chuỗi tìm kiếm. Các khớp dòng được highlight trong lệnh.

Nếu lệnh tìm thấy không phù hợp, để tiếp tục tìm kiếm trong lịch sử, nhấn CTRL+R/CTRL+S lại. Kết quả, lệnh tiếp theo tương ứng với mẫu tìm kiếm sẽ xuất hiện trên màn hình.

Lịch sử lệnh trước đó trong PowerShell Console

Sử dụng phím F8, bạn có thể tìm lệnh trong lịch sử khớp với văn bản trên dòng lệnh hiện tại. Ví dụ, nhập get- và nhấn F8. Mục cuối cùng trong lịch sử lệnh khớp với văn bản này sẽ được tìm thấy. Để chuyển đến lệnh tiếp theo trong lịch sử, nhấn F8 lại.

Lịch sử lệnh trước đó trong PowerShell Console

Bạn cũng có thể dùng ký tự # để tìm kiếm trong lịch sử lệnh. Ví dụ, để tìm lệnh cuối cùng bắt đầu bằng Get-WMI, gõ #get-wmi và nhấn phím Tab. Lệnh cuối cùng khớp với mẫu sẽ xuất hiện trong console:

Lịch sử lệnh trước đó trong PowerShell Console

Lịch sử lệnh hoạt động giống nhau trong cả Windows PowerShell cổ điển và PowerShell Core mới (nếu bạn đã nâng cấp phiên bản PoSh).

Để lấy danh sách lệnh PoSh trước đó trong cửa sổ Notepad.exe, chạy lệnh:

notepad (Get-PSReadLineOption | select -ExpandProperty HistorySavePath)

Lịch sử lệnh trước đó trong PowerShell ConsoleĐể hiển thị danh sách lệnh trong lịch sử khớp với truy vấn, bạn có thể dùng:

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

Lịch sử lệnh trước đó trong PowerShell Console

Quản lý lịch sử lệnh PowerShell với module PSReadLine

Chức năng lịch sử lệnh trong PowerShell 5.0 không được tích hợp sẵn trong Windows Management Framework, mà dựa trên module bên thứ ba PSReadLine, mở rộng đáng kể chức năng của PowerShell console. PSReadLine highlight cú pháp trong console, chịu trách nhiệm chọn văn bản bằng chuột và copy/paste dùng CTRL+C và CTRL+V. Module này trong Windows 10 nằm trong thư mục C:\Program Files\WindowsPowerShell\Modules\PSReadline và tự động được import khi khởi động PowerShell console.

PSReadLine không được bao gồm trong trình cài đặt PowerShell 5.0 độc lập (hoặc mới hơn) cho các phiên bản Windows trước. Do đó, nếu bạn muốn sử dụng chức năng lịch sử lệnh PowerShell trong các phiên bản Windows trước (Windows 7/8.1 và Windows Server 2008R2/2012R2), ngoài việc cài đặt Windows Management Framework 5.1, bạn sẽ cần cài đặt module PSReadLine qua module PackageManagement (trước đây là OneGet) từ kho trực tuyến bằng lệnh:

Install-Module PSReadLine

Danh sách đầy đủ các hàm của module PSReadLine để quản lý lịch sử lệnh trong PowerShell và các phím được gán cho chúng có thể hiển thị bằng lệnh:

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

Lịch sử lệnh trước đó trong PowerShell Console

Lịch sử lệnh có thể cấu hình bằng cmdlet Get-PSReadlineOption và Set-PSReadlineOption. Cài đặt PSReadline hiện tại có thể xem bằng lệnh:

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

Lịch sử lệnh trước đó trong PowerShell Console

Cài đặt các tham số PSReadline sau có thể quan trọng:

  • HistoryNoDuplicates – xác định xem các lệnh trùng lặp có được lưu không;
  • MaximumHistoryCount – số lượng lệnh lưu trữ tối đa (mặc định lưu 4096 lệnh cuối);
  • HistorySearchCursorMovesToEnd — xác định xem con trỏ có di chuyển đến cuối lệnh khi tìm kiếm không;
  • HistorySearchCaseSensitive – xác định tìm kiếm có phân biệt chữ hoa/thường không (lịch sử lệnh PS mặc định không phân biệt);
  • HistorySavePath – hiển thị đường dẫn file lưu lệnh;
  • HistorySaveStyle – xác định đặc điểm lưu lệnh:
    • SaveIncrementally — lệnh được lưu sau khi chạy (mặc định);
    • SaveAtExit — lịch sử được lưu khi đóng console PowerShell;
    • SaveNothing — tắt lưu lịch sử lệnh.

Bạn có thể thay đổi cài đặt module PSReadLine bằng Set-PSReadlineOption. Ví dụ:

Set-PSReadlineOption -HistorySaveStyle SaveAtExit

Lịch sử lệnh trước đó trong PowerShell Console

Để tăng số lượng lệnh PowerShell lưu trong file log, chạy lệnh:

Set-PSReadlineOption -MaximumHistoryCount 10000

Vậy, khả năng lưu lịch sử lệnh PowerShell đã thực thi là một trong những lý do ưu tiên console PoSh hơn cmd.

Cách xóa lịch sử lệnh PowerShell Console?

Như đã giải thích, module PSReadline lưu tất cả lệnh PowerShell console vào file văn bản. Tuy nhiên, trong một số trường hợp, quản trị viên phải nhập các thông tin nhạy cảm trong console PowerShell (thông tin đăng nhập, mật khẩu, địa chỉ, dữ liệu cá nhân, v.v.). Do đó, quản trị viên server khác hoặc kẻ tấn công có thể truy cập dữ liệu lịch sử trong file văn bản thuần túy. Vì lý do bảo mật, bạn có thể cần xóa lịch sử các lệnh PowerShell đã thực thi hoặc tắt hoàn toàn lịch sử lệnh.

Cmdlet Clear-History chỉ dùng để xóa lịch sử lệnh trong bộ nhớ của phiên PowerShell hiện tại. Nó chỉ xóa danh sách các lệnh trước đó mà cmdlet Get-History hiển thị.

Bạn có thể xóa chỉ một lệnh trước đó khỏi lịch sử:

Clear-History -count 1 -newest

Hoặc xóa tất cả lệnh với mẫu cụ thể:
Clear-History -CommandLine *set-ad*

Để xóa hoàn toàn lịch sử các lệnh PowerShell trước đó, bạn cần xóa file ConsoleHost_history.txt mà chúng được ghi bởi module PSReadline. Bạn có thể lấy vị trí file lịch sử PowerShell hiện tại và xóa nó bằng lệnh:

Remove-Item (Get-PSReadlineOption).HistorySavePath

Sau đó, đóng cửa sổ PowerShell console.

Nếu bạn muốn tắt hoàn toàn việc lưu lịch sử lệnh PowerShell vào file văn bản, chạy lệnh:

Set-PSReadlineOption -HistorySaveStyle SaveNothing

Lịch sử lệnh trước đó trong PowerShell Console

Cách Export/Import lịch sử lệnh PowerShell sang phiên khác?

Đôi khi rất tiện lợi khi có cùng một tập lệnh PowerShell thường dùng trên các máy tính khác nhau. Bạn có thể export lịch sử lệnh hiện tại trên máy tính của bạn ra file xml và import nó sang máy tính khác. Cũng có thể làm bằng cách copy file ConsoleHost_history.txt vào hồ sơ người dùng trên các máy tính mong muốn.

Để export lệnh từ phiên hiện tại ra file, bạn có thể dùng cmdlet Export-Clixml:

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

Để import lịch sử lệnh từ file vào phiên PoSh khác (trên máy cục bộ hoặc máy khác):

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

Lịch sử lệnh trước đó trong PowerShell Console

Để tự động export các lệnh trước đó ra file khi kết thúc phiên PowerShell, bạn có thể gán script vào sự kiện kết thúc phiên PoSh (!! Phiên phải kết thúc bằng lệnh exit, không chỉ đóng cửa sổ PowerShell):

$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 }