PowerShell: peningkatan riwayat (readline)?

12

Beberapa hal yang saya sukai di Bash dan ingin tahu bagaimana melakukannya di PowerShell:

  1. Di Bash, saya memiliki pengaturan pengguliran sejarah sehingga hanya menggulir perintah yang dimulai dengan awalan yang sama dengan baris saat ini. Jika saya ingin melihat komit terbaru saya (mis. Untuk menggunakan kembali sebagian dari komentar) saya menulis 'git' lalu .

  2. Terkait tentu saja pencarian sejarah dengan Ctrl+R

  3. Untuk menemukan hal-hal lain, saya menulis:

    h | grep foo
    

    Di PowerShell saya menggunakan:

    h -c 1000 | where {$_.commandline.contains("foo")}
    

    (jelas saya seorang pemula, pasti ada cara yang lebih pendek)

  4. Hal-hal seperti:

    mv file.txt{,.bak}
    

    atau

    mv file.txt !#$.bak
    
  5. Ruang ajaib (yang mengembang !$sejajar)

Apa saja alternatif di PowerShell?

IttayD
sumber

Jawaban:

2

Untuk (3), Anda dapat menuliskannya sebagai fungsi di profil Anda (misalnya %USERPROFILE%\My Documents\WindowsPowerShell\profile.ps1):

function hh ([string] $word) {
    Get-History -c 1000 | where {$_.commandline.contains($word)}
}

Kemudian:

hh foo

Tapi Powershell lebih baik dianggap sebagai bahasa scripting daripada sebagai shell interaktif, karena konsol yang mendasarinya masih cmd.exe dengan semua keterbatasannya.

Jadi itu F7 untuk sejarah interaktif, F3 untuk menyalin perintah sebelumnya, F1 untuk menyalin satu karakter, F2 untuk menyalin perintah sebelumnya hingga karakter tertentu, dll, dll.

njd
sumber
1
Konsol yang mendasari IS masih cmd? Saya kira tidak.
sinni800
1
konsol adalah subsistem konsol windows, yang juga digunakan oleh cmd dan aplikasi konsol lainnya. Ini memiliki banyak hal aneh, seperti streaming dan pengeditan perintah dan seleksi aneh dan penyelesaian TAB. Powershell ISE v3 sangat baik, tetapi tidak bekerja dengan baik dengan aplikasi konsol "legacy". Cmdlet sangat bagus di ISE.
Jay Bazuzi
15

1 - Anda dapat menggunakan F8dari konsol windows untuk menelusuri perintah yang sesuai dengan awal baris saat ini. Ini adalah pertandingan yang sensitif dengan huruf besar-kecil.

2 - Anda dapat menggunakan #untuk mencocokkan perintah sebelumnya. Penggunaan #<partial match><tab>tidak sensitif huruf dan akan mencocokkan teks pada posisi apa pun di perintah sebelumnya.

Jika Anda memiliki riwayat perintah berikut:

# 1
$np = Start-Process notepad -PassThru
# 2
$np| get-process
# 3
$np| Stop-Process

Mengetik #prkemudian tabberulang kali akan menggilir 1, 2 dan 3.

Mengetik #stkemudian tabberulang kali akan menggilir 1 dan 3.

Hanya menggunakan # akan cocok dengan semua riwayat.

#juga dapat digunakan setelah memasukkan bagian dari perintah. Jika riwayat Anda adalah:

'notepad'
select *

Anda bisa mengetik Get-Process #n<tab>| #s<tab>untuk mendapatkanGet-Process 'notepad'| select *

3 - Anda dapat menggunakan Select-String. Buat alias agar mudah digunakan (PowerShell v3 menambahkan alias sls). Anda kemudian bisa melakukannya.

h| sls foo

4 - Anda dapat melakukan sesuatu seperti:

gci *a.txt| ren -n {$_.Name + '.bak'}

5 - $$cocok dengan token terakhir dari perintah terakhir, tapi saya tidak tahu cara untuk memperluas inline.

Rynant
sumber