PowerShell: cải tiến lịch sử (đường dẫn)?


12

Một số điều tôi thích ở Bash và rất thích biết cách thực hiện trong PowerShell:

  1. Trong Bash, tôi có cuộn lịch sử được thiết lập để nó chỉ cuộn các lệnh bắt đầu với cùng tiền tố với dòng hiện tại. Nếu tôi muốn xem cam kết mới nhất của mình (ví dụ: sử dụng lại một phần của nhận xét), tôi viết 'git' và sau đó .

  2. Liên quan tất nhiên là tìm kiếm lịch sử với Ctrl+R

  3. Để tìm những thứ khác, tôi viết:

    h | grep foo
    

    Trong PowerShell tôi sử dụng:

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

    (rõ ràng tôi là người mới, phải có cách ngắn hơn)

  4. Những thứ như:

    mv file.txt{,.bak}
    

    hoặc là

    mv file.txt !#$.bak
    
  5. Không gian ma thuật (mở rộng !$nội tuyến)

Các lựa chọn thay thế trong PowerShell là gì?

Câu trả lời:


2

Đối với (3), bạn có thể viết nó dưới dạng một hàm trong hồ sơ của mình (ví dụ %USERPROFILE%\My Documents\WindowsPowerShell\profile.ps1):

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

Sau đó:

hh foo

Nhưng Powershell được coi là ngôn ngữ kịch bản tốt hơn là vỏ tương tác, bởi vì bảng điều khiển bên dưới vẫn là cmd.exe với tất cả các giới hạn của nó.

Vì vậy, đó là F7 cho lịch sử tương tác, F3 để sao chép lệnh trước đó, F1 để sao chép một ký tự đơn, F2 để sao chép lệnh trước đó lên một ký tự cụ thể, v.v.


1
Bảng điều khiển cơ bản IS vẫn cmd? Tôi đã không nghĩ như vậy.
sinni800

1
giao diện điều khiển là hệ thống con giao diện điều khiển windows, cũng được sử dụng bởi cmd và bất kỳ ứng dụng giao diện điều khiển nào khác. Nó có rất nhiều thứ kỳ lạ, như luồng và chỉnh sửa lệnh và lựa chọn lạ và hoàn thành TAB. Powershell ISE v3 rất tốt, nhưng không hoạt động tốt với các ứng dụng bảng điều khiển "di sản". Cmdlets là tuyệt vời trong ISE.
Jay Bazuzi

15

1 - Bạn có thể sử dụng F8từ bảng điều khiển windows để chuyển qua các lệnh khớp với đầu dòng hiện tại. Đây là một trường hợp phù hợp nhạy cảm.

2 - Bạn có thể sử dụng #để khớp với các lệnh trước đó. Sử dụng #<partial match><tab>là không phân biệt chữ hoa chữ thường và sẽ khớp văn bản ở bất kỳ vị trí nào trong các lệnh trước đó.

Nếu bạn có lịch sử lệnh sau:

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

#prsau đó tablặp đi lặp lại sẽ chuyển qua 1, 2 và 3.

#stsau đó tablặp đi lặp lại sẽ chuyển qua 1 và 3.

Chỉ sử dụng # sẽ phù hợp với tất cả lịch sử.

#cũng có thể được sử dụng sau khi nhập một phần của lệnh. Nếu lịch sử của bạn là:

'notepad'
select *

Bạn có thể gõ Get-Process #n<tab>| #s<tab>để có đượcGet-Process 'notepad'| select *

3 - Bạn có thể sử dụng Select-String. Tạo một bí danh cho nó để dễ sử dụng (PowerShell v3 đã thêm bí danh sls). Bạn có thể làm sau đó.

h| sls foo

4 - Bạn có thể làm một cái gì đó như:

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

5 - $$khớp với mã thông báo cuối cùng của lệnh cuối cùng, nhưng tôi không biết cách mở rộng nội tuyến.


2

Bạn nên kiểm tra mô-đun PSReadline của Oisin Grehan: http://nOLL.org/blog/post/2012/09/12/Emulation-Bash-GNU-Readline-with-PowerShell-30

Mã có sẵn ở đây: https://bitbucket.org/oising/psreadline/overview

Điều này làm cho PowerShell thực sự có thể sử dụng như một CLI, từ quan điểm của các quản trị viên có kinh nghiệm * nix thỉnh thoảng làm việc với Windows, bằng cách thêm các ràng buộc EMACS cơ bản để chỉnh sửa dòng, tìm kiếm lịch sử, v.v.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.