Computer >> Máy Tính >  >> Hệ thống >> máy chủ Windows

Lịch sử lệnh trước trong Bảng điều khiển PowerShell

Theo mặc định, Windows PowerShell (cũng như dấu nhắc lệnh) 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ổ bảng điều khiển PowerShell hoặc khởi động lại máy tính của mình, lịch sử của các lệnh PowerShell mà bạn đã nhập sẽ không được lưu ở bất kỳ đâu. So với bash, đây là một nhược điểm đáng kể. Bắt đầu với PowerShell 5.0 được giới thiệu trong Windows 10 (Windows Server 2016), tất cả các lệnh được nhập vào bảng điều khiển PS hiện được lưu vào tệp nhật ký văn bản thuần túy theo mặc định.

Lịch sử lệnh trong PowerShell 5.0 trở lên

Giả sử bạn đã nhập và thực hiện 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ẽ được 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 hiện trước đó. Do đó, bằng cách sử dụng các phím “Up arrow ”Và“ Down arrow ”Bạn có thể cuộn qua lịch sử của các lệnh PoSh và thực hiện lại các lệnh đã nhập trước đó.

Trong các phiên bản PowerShell trước đó, lịch sử của các lệnh trong phiên hiện tại sẽ không được lưu sau khi đóng. Sử dụng 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 cách sử dụng Get-History lệnh ghép ngắn.

Bạn có thể hiển thị thông tin chi tiết hơn về các lệnh đã thực hiện 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 Bảng điều khiển PowerShell

Theo mặc định, PowerShell trong Windows 10 lưu 4096 lệnh cuối cùng được lưu trữ trong tệp 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 trữ riêng cho PowerShell và PowerShell ISE.

Lịch sử lệnh trước trong Bảng điều khiển PowerShell

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

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

F7 khóa được sử dụng để tìm kiếm trong lịch sử cmd.

Lịch sử lệnh trước trong Bảng điều khiển PowerShell

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 các mũi tên lên / xuống, bạn có thể tìm kiếm lịch sử lệnh bằng cách sử dụng phím tắt CTRL + R (tìm kiếm ngược) và CTR + S (tìm kiếm chuyển tiếp). Nhấn tổ hợp phím và bắt đầu nhập một phần của lệnh bạn muốn tìm trong các lệnh đã thực hiện trước đó. Văn bản bạn đã nhập sẽ được tìm thấy trong lịch sử lệnh ở bất kỳ vị trí nào (không giống như tìm kiếm trong PowerShell bằng cách sử dụng F8 hoặc Shift+F8 , chỉ cho phép tìm kiếm các kết quả phù hợp từ đầu dòng). Bảng điều khiển PowerShell sẽ hiển thị lệnh trước đó tương ứng với chuỗi tìm kiếm. Đối sánh dòng được đánh dấu trong lệnh.

Nếu lệnh tìm thấy không phù hợp với bạn, để tiếp tục tìm kiếm trong lịch sử, hãy nhấn CTRL+R / CTRL+S lần nữa. Do đó, lệnh sau 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 Bảng điều khiển PowerShell

Sử dụng F8 , bạn có thể tìm thấy 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 nhập 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 một lần nữa.

Lịch sử lệnh trước trong Bảng điều khiển PowerShell

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

Lịch sử lệnh trước trong Bảng điều khiển PowerShell

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 của mình).

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

notepad (Get-PSReadLineOption | select -ExpandProperty HistorySavePath)

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

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

Lịch sử lệnh trước trong Bảng điều khiển PowerShell

Quản lý Lịch sử Lệnh PowerShell bằng Mô-đun 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 PSReadLine của bên thứ ba , giúp mở rộng đáng kể chức năng của bảng điều khiển PowerShell. PSReadLine làm nổi bật cú pháp trong bảng điều khiển, nó chịu trách nhiệm chọn văn bản bằng chuột của bạn và sao chép / dán nó bằng cách sử dụng CTRL+CCTRL+V . Mô-đun này trong Windows 10 nằm trong C:\ Program Files \ WindowsPowerShell \ Modules \ PSReadline và được nhập tự động khi bảng điều khiển PowerShell khởi động.

PSReadLine không được bao gồm trong trình cài đặt PowerShell 5.0 (hoặc không bao giờ) độc lập 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 mô-đun PSReadLine thông qua mô-đun PackageManagement. (trước đây là OneGet) từ kho lưu trữ trực tuyến bằng lệnh:

Install-Module PSReadLine

Danh sách đầy đủ các chức năng của mô-đun PSReadLine để quản lý lịch sử lệnh trong PowerShell và các phím được gán cho chúng có thể được 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 Bảng điều khiển PowerShell

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

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

Lịch sử lệnh trước trong Bảng điều khiển PowerShell

Cài đặt của các tham số PSReadline sau đây có thể quan trọng đối với chúng tôi:

  • Lịch sử Không trùng lặp - xác định xem có phải lưu các lệnh giống nhau hay không;
  • MaximumHistoryCount - số lượng lệnh lưu trữ tối đa (theo mặc định là 4096 lệnh cuối cùng được lưu);
  • HistorySearchCursorMovesToEnd - xác định xem bạn có phải đi đến cuối lệnh khi tìm kiếm hay không;
  • HistorySearchCaseSensitive - xác định xem tìm kiếm có phân biệt chữ hoa chữ thường hay không (lịch sử lệnh PS không phân biệt chữ hoa chữ thường theo mặc định);
  • HistorySavePath - hiển thị đường dẫn đến tệp mà lệnh được lưu trữ;
  • HistorySaveStyle - xác định tính đặc thù của các lệnh lưu:
    • SaveIncrementally - các lệnh được lưu sau khi chúng được chạy (theo mặc định);
    • SaveAtExit - lịch sử được lưu khi bảng điều khiển PowerShell đóng;
    • SaveNothing - tắt lưu lịch sử lệnh.

Bạn có thể thay đổi cài đặt của mô-đun PSReadLine bằng cách sử dụng Set-PSReadlineOption . Ví dụ:

Set-PSReadlineOption -HistorySaveStyle SaveAtExit

Lịch sử lệnh trước trong Bảng điều khiển PowerShell

Để tăng số lượng lệnh PowerShell được lưu trong tệp nhật ký, hãy chạy lệnh:

Set-PSReadlineOption -MaximumHistoryCount 10000

Vì vậy, khả năng lưu lịch sử của các lệnh PowerShell đã thực thi là một trong những lý do để thích bảng điều khiển PoSh hơn cmd.

Cách xóa lệnh lịch sử bảng điều khiển PowerShell?

Như chúng tôi đã giải thích ở trên, mô-đun PSReadline lưu tất cả các lệnh của bảng điều khiển PowerShell vào một tệp văn bản. Tuy nhiên, trong một số trường hợp, quản trị viên phải nhập nhiều thông tin nhạy cảm khác nhau trong bảng điều khiển PowerShell (thông tin xác thực, mật khẩu, địa chỉ, dữ liệu cá nhân, v.v.). Do đó, quản trị viên máy chủ hoặc kẻ tấn công khác có thể truy cập dữ liệu lịch sử trong một tệp 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ủa các lệnh PowerShell đã thực thi hoặc vô hiệu hóa hoàn toàn lịch sử lệnh.

Xóa lịch sử lệnh ghép ngắn chỉ có thể được sử 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à lệnh ghép ngắn Get-History hiển thị.

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

Clear-History -count 1 -newest

Hoặc xóa tất cả các lệnh bằng một mẫu cụ thể:
Clear-History -CommandLine *set-ad*

Để xóa hoàn toàn lịch sử của các lệnh PowerShell trước đó, bạn cần xóa tệp ConsoleHost_history.txt mà chúng được ghi bởi mô-đun PSReadline. Bạn có thể lấy vị trí tệp 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ổ bảng điều khiển PowerShell.

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

Set-PSReadlineOption -HistorySaveStyle SaveNothing

Lịch sử lệnh trước trong Bảng điều khiển PowerShell

Làm cách nào để xuất / nhập lịch sử lệnh PowerShell sang một phiên khác?

Đôi khi, rất tiện lợi khi có cùng một bộ lệnh PowerShell được sử dụng thường xuyên trên các máy tính khác nhau. Bạn có thể xuất lịch sử lệnh hiện tại trên máy tính của mình thành tệp xml và nhập vào các máy tính khác. Ngoài ra, điều này có thể được thực hiện bằng cách sao chép tệp ConsoleHost_history.txt vào hồ sơ người dùng trên máy tính mong muốn.

Để xuất các lệnh từ phiên hiện tại sang một tệp, bạn có thể sử dụng Export-Clixml lệnh ghép ngắn:

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

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

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

Lịch sử lệnh trước trong Bảng điều khiển PowerShell

Để tự động xuất các lệnh trước đó sang tệp vào cuối phiên PowerShell, bạn có thể liên kết tập lệnh với sự kiện kết thúc phiên PoSh (!! Phiên phải được kết thúc bằng exit , thay vì 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 }