PowerShell: การปรับปรุงประวัติ (readline)


12

บางสิ่งที่ฉันชอบใน Bash และชอบที่จะรู้ว่าต้องทำอย่างไรใน PowerShell:

  1. ใน Bash ฉันมีการตั้งค่าการเลื่อนประวัติเพื่อให้เลื่อนเฉพาะคำสั่งที่ขึ้นต้นด้วยคำนำหน้าเดียวกับบรรทัดปัจจุบัน หากฉันต้องการเห็นการกระทำล่าสุดของฉัน (เช่นเพื่อนำส่วนหนึ่งของความคิดเห็นกลับมาใช้ใหม่) ฉันเขียน 'git' แล้ว .

  2. ที่เกี่ยวข้องแน่นอนว่าการค้นหาประวัติด้วย Ctrl + R

  3. เพื่อหาสิ่งอื่นฉันเขียน:

    h | grep foo
    

    ใน PowerShell ฉันใช้:

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

    (เห็นได้ชัดว่าฉันเป็นมือใหม่ต้องมีวิธีที่สั้นกว่า)

  4. สิ่งที่ชอบ:

    mv file.txt{,.bak}
    

    หรือ

    mv file.txt !#$.bak
    
  5. พื้นที่เวทย์มนตร์ (ที่ขยาย !$ อินไลน์)

PowerShell มีทางเลือกอะไรบ้าง?

คำตอบ:


2

สำหรับ (3) คุณสามารถเขียนเป็นฟังก์ชั่นในโปรไฟล์ของคุณ (เช่น %USERPROFILE%\My Documents\WindowsPowerShell\profile.ps1 ):

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

แล้ว:

hh foo

แต่ Powershell ถือเป็นภาษาสคริปต์ที่ดีที่สุดกว่าเชลล์เชิงโต้ตอบเนื่องจากคอนโซลพื้นฐานยังคงเป็น cmd.exe พร้อมข้อ จำกัด ทั้งหมด

ดังนั้นมันจึงเป็น F7 สำหรับประวัติเชิงโต้ตอบ F3 ในการคัดลอกคำสั่งก่อนหน้า F1 เพื่อคัดลอกอักขระเดียว F2 เพื่อคัดลอกคำสั่งก่อนหน้าไปยังอักขระเฉพาะ ฯลฯ ฯลฯ


1
คอนโซลพื้นฐานยังคงเป็นคำสั่ง? ฉันไม่คิดอย่างนั้น
sinni800

1
คอนโซลเป็นระบบย่อยคอนโซล windows ซึ่งยังถูกใช้โดย cmd และแอ็พพลิเคชันคอนโซลอื่น ๆ มันมีของแปลก ๆ มากมายเช่นลำธารและการแก้ไขคำสั่งและการเลือกที่แปลกและการเติม TAB Powershell ISE v3 นั้นดีมาก แต่ทำงานได้ไม่ดีกับแอปคอนโซล "ดั้งเดิม" Cmdlets นั้นยอดเยี่ยมใน ISE
Jay Bazuzi

14

1 - คุณสามารถใช้ F8 จากคอนโซล windows เพื่อวนคำสั่งที่ตรงกับจุดเริ่มต้นของบรรทัดปัจจุบัน นี่คือการแข่งขันที่สำคัญ

2 - คุณสามารถใช้ # เพื่อจับคู่คำสั่งก่อนหน้า การใช้ #<partial match><tab> ไม่คำนึงถึงขนาดตัวพิมพ์และจะจับคู่ข้อความที่ตำแหน่งใด ๆ ในคำสั่งก่อนหน้า

หากคุณมีประวัติคำสั่งต่อไปนี้:

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

การพิมพ์ #pr แล้วก็ แถบ วนซ้ำ ๆ จะวนผ่าน 1, 2 และ 3

การพิมพ์ #st แล้วก็ แถบ จะวนซ้ำผ่าน 1 และ 3 ซ้ำ ๆ

การใช้ # เท่านั้นจะตรงกับประวัติทั้งหมด

# ยังสามารถใช้งานได้หลังจากป้อนส่วนหนึ่งของคำสั่งแล้ว หากประวัติของคุณคือ:

'notepad'
select *

คุณสามารถพิมพ์ Get-Process #n<tab>| #s<tab> ที่จะได้รับ Get-Process 'notepad'| select *

3 - คุณสามารถใช้ Select-String. สร้างนามแฝงเพื่อให้ใช้งานง่าย (PowerShell v3 เพิ่มนามแฝง sls ) จากนั้นคุณสามารถทำได้

h| sls foo

4 - คุณสามารถทำสิ่งที่ชอบ:

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

5 - $$ ตรงกับโทเค็นสุดท้ายของคำสั่งสุดท้าย แต่ฉันไม่ทราบวิธีขยายอินไลน์


2

คุณควรตรวจสอบโมดูล PSReadline ของ Oisin Grehan: http://nivot.org/blog/post/2012/09/12/Emulating-Bash-GNU-Readline-with-PowerShell-30

รหัสมีอยู่ที่นี่: https://bitbucket.org/oising/psreadline/overview

สิ่งนี้ทำให้ PowerShell ใช้งานได้จริงในฐานะ CLI จากมุมมองของผู้ดูแลระบบ * nix ที่มีประสบการณ์ซึ่งทำงานกับ Windows เป็นครั้งคราวโดยเพิ่ม EMACS พื้นฐานสำหรับการแก้ไขบรรทัดการค้นหาประวัติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.