Cara mencari riwayat perintah Powershell dari sesi sebelumnya

16

Saya menggunakan Windows 10 saat ini dengan Powershell 5.1. Seringkali, saya ingin mencari perintah yang saya gunakan di masa lalu untuk memodifikasi dan / atau menjalankannya kembali. Tidak dapat dihindari, perintah yang saya cari dijalankan di jendela / sesi PowerShell sebelumnya atau berbeda.

Ketika saya memalu kunci, saya dapat menelusuri banyak, banyak perintah dari banyak, banyak sesi, tetapi ketika saya mencoba mencari melalui menggunakan Get-History | Where-Object {$_.CommandLine -Like "*docker cp*"}, saya tidak mendapatkan hasil. Pemecahan masalah dasar mengungkapkan bahwa Get-Historytidak menunjukkan apa pun dari sesi sebelumnya, seperti yang ditunjukkan oleh:

C:\Users\Me> Get-History

  Id CommandLine
  -- -----------
   1 Get-History | Where-Object {$_.CommandLine -Like "*docker cp*"}

Bagaimana saya bisa mencari melalui perintah-perintah sebelumnya yang diberikan kunci menggunakan Get-Historyatau Cmdlet lain?

shawmanz32na
sumber

Jawaban:

23

Riwayat persisten yang Anda sebutkan disediakan oleh PSReadLine . Ini terpisah dari sesi-terikat Get-History.

Riwayat disimpan dalam file yang ditentukan oleh properti (Get-PSReadlineOption).HistorySavePath. Lihat file ini dengan Get-Content (Get-PSReadlineOption).HistorySavePath, atau editor teks, dll. Periksa opsi terkait dengan Get-PSReadlineOption. PSReadLine juga melakukan pencarian riwayat melalui ctrl+ r.

Menggunakan contoh yang Anda berikan:

Get-Content (Get-PSReadlineOption).HistorySavePath | ? { $_ -like '*docker cp*' }

jscott
sumber
3

Jawaban singkat:

  • Tekan Ctrl+ Rdan kemudian mulai mengetik, untuk mencari mundur dalam sejarah secara interaktif. Ini cocok dengan teks dari mana saja di baris perintah. Tekan Ctrl+ Rlagi untuk menemukan kecocokan berikutnya.
  • Ctrl+ Sberfungsi seperti di atas, tetapi mencari ke depan dalam sejarah. Anda dapat menggunakan Ctrl+ R/ Ctrl+ Suntuk bolak-balik di hasil pencarian.
  • Ketikkan teks, lalu tekan F8. Ini mencari item sebelumnya dalam sejarah yang dimulai dengan input saat ini.
  • Shift+ F8berfungsi seperti F8, tetapi mencari maju.

Jawaban panjang:

Seperti @jscott disebutkan dalam jawabannya, PowerShell 5.1 atau lebih tinggi di Windows 10, menggunakan PSReadLinemodul untuk mendukung lingkungan pengeditan perintah. Pemetaan kunci penuh dari modul ini dapat diambil dengan menggunakan Get-PSReadLineKeyHandlercmdlet. Untuk melihat semua pemetaan kunci yang terkait dengan riwayat, gunakan perintah berikut:

Get-PSReadlineKeyHandler | ? {$_.function -like '*hist*'}

dan inilah outputnya:

History functions
=================
Key       Function              Description
---       --------              -----------
Alt+F7    ClearHistory          Remove all items from the command line history (not PowerShell history)
Ctrl+s    ForwardSearchHistory  Search history forward interactively
F8        HistorySearchBackward Search for the previous item in the history that starts with the current input - like
                                PreviousHistory 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
DownArrow NextHistory           Replace the input with the next item in the history
UpArrow   PreviousHistory       Replace the input with the previous item in the history
Ctrl+r    ReverseSearchHistory  Search history backwards interactively
Mohammad Dehghan
sumber
1
Sangat berguna! Perhatikan bahwa banyak Ctrl+Rpenekanan akan menggilir hasil.
Ohad Schneider
1

Saya memilikinya di profil PS saya:

function hist { $find = $args; Write-Host "Finding in full history using {`$_ -like `"*$find*`"}"; Get-Content (Get-PSReadlineOption).HistorySavePath | ? {$_ -like "*$find*"} | Get-Unique | more }

Adam Wemlinger
sumber