เกี่ยวกับ PSReadLine
คำอธิบายสั้น ๆ
PSReadLine มอบประสบการณ์การแก้ไขบรรทัดคำสั่งที่ได้รับการปรับปรุงในคอนโซล PowerShell
คำอธิบายแบบยาว
PowerShell 7.4 มาพร้อมกับ PSReadLine 2.3.4 เวอร์ชันปัจจุบันคือ PSReadLine 2.3.4 PSReadLine เวอร์ชันปัจจุบันสามารถติดตั้งและใช้งานได้บน Windows PowerShell 5.1 และใหม่กว่า สำหรับคุณสมบัติบางอย่าง คุณต้องใช้งาน PowerShell 7.2 หรือสูงกว่า
PSReadLine มอบประสบการณ์การแก้ไขบรรทัดคำสั่งที่มีประสิทธิภาพสำหรับคอนโซล PowerShell มันมี:
- การระบายสีไวยากรณ์ของบรรทัดคำสั่ง
- การแสดงภาพข้อผิดพลาดทางไวยากรณ์
- ประสบการณ์หลายบรรทัดที่ดีกว่า (ทั้งการแก้ไขและประวัติ)
- การผูกคีย์ที่ปรับแต่งได้
- โหมด Cmd และ Emacs
- ตัวเลือกการกำหนดค่ามากมาย
- เสร็จสิ้นสไตล์ Bash (เป็นทางเลือกในโหมด Cmd, ค่าเริ่มต้นในโหมด Emacs)
- Emacs ดึง/คิลริง
- การเคลื่อนไหวและการลบ "คำ" ที่ใช้โทเค็น PowerShell
- ระบบคาดการณ์ IntelliSense
- การแสดงความช่วยเหลือแบบไดนามิกในคอนโซลโดยไม่สูญเสียตำแหน่งในบรรทัดคำสั่ง
PSReadLine ต้องใช้ PowerShell 5.1 หรือใหม่กว่า PSReadLine ทำงานร่วมกับโฮสต์คอนโซล Windows เริ่มต้น, Windows Terminal และ Visual Studio Code มันไม่ทำงานใน Windows PowerShell ISE
PSReadLine สามารถติดตั้งได้จาก PowerShell Gallery หากต้องการติดตั้ง PSReadLine ใน PowerShell เวอร์ชันที่รองรับ ให้รันคำสั่งต่อไปนี้
Install-Module -Name PSReadLine -AllowClobber -Force
บันทึก
ตั้งแต่ PowerShell 7.0 เป็นต้นไป PowerShell จะข้ามการโหลด PSReadLine อัตโนมัติบน Windows หากตรวจพบโปรแกรมอ่านหน้าจอ ในปัจจุบัน PSReadLine ทำงานได้ไม่ดีกับโปรแกรมอ่านหน้าจอ การเรนเดอร์และการจัดรูปแบบเริ่มต้นของ PowerShell 7.0 บน Windows ทำงานได้อย่างถูกต้อง คุณสามารถโหลดโมดูลด้วยตนเองได้หากจำเป็น
ระบบคาดการณ์ IntelliSense
Predictive IntelliSense เป็นส่วนเสริมจากแนวคิดเรื่องการเติมแท็บให้สมบูรณ์ซึ่งจะช่วยให้ผู้ใช้กรอกคำสั่งได้สำเร็จ ช่วยให้ผู้ใช้สามารถค้นพบ แก้ไข และดำเนินการคำสั่งทั้งหมดโดยอิงตามการคาดการณ์ที่ตรงกันจากประวัติของผู้ใช้และปลั๊กอินเฉพาะโดเมนเพิ่มเติม
เปิดใช้งาน Predictive IntelliSense
Predictive IntelliSense ถูกปิดใช้งานตามค่าเริ่มต้น หากต้องการเปิดใช้งานการทำนาย เพียงรันคำสั่งต่อไปนี้:
Set-PSReadLineOption -PredictionSource History
พารามิเตอร์ PredictionSource ยังสามารถยอมรับปลั๊กอินสำหรับข้อกำหนดเฉพาะโดเมนและข้อกำหนดที่กำหนดเองได้
หากต้องการปิดใช้งาน Predictive IntelliSense เพียงเรียกใช้:
Set-PSReadLineOption -PredictionSource None
บันทึก
Predictive IntelliSense ถูกเปิดใช้งานตามค่าเริ่มต้นใน PSReadLine 2.2.6 สำหรับข้อมูลเพิ่มเติม โปรดดูประวัติการเผยแพร่ PSReadLine ในส่วน หมายเหตุ ด้านล่าง
การผูกคีย์แบบกำหนดเอง
PSReadLine รองรับการผูกคีย์แบบกำหนดเองโดยใช้ Set-PSReadLineKeyHandler cmdlet การผูกคีย์แบบกำหนดเองส่วนใหญ่จะเรียกหนึ่งในฟังก์ชันที่ผูกได้ เป็นต้น
Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
คุณสามารถผูก ScriptBlock เข้ากับคีย์ได้ ScriptBlock สามารถทำทุกอย่างที่คุณต้องการได้ ตัวอย่างที่เป็นประโยชน์ได้แก่
- แก้ไขบรรทัดคำสั่ง
- การเปิดหน้าต่างใหม่ (เช่น วิธีใช้)
- เปลี่ยนไดเร็กทอรีโดยไม่ต้องเปลี่ยนบรรทัดคำสั่ง
ScriptBlock ได้รับสองข้อโต้แย้ง:
$key- ออบเจ็กต์ [ConsoleKeyInfo] ที่เป็นคีย์ที่ทริกเกอร์การเชื่อมโยงแบบกำหนดเอง หากคุณผูก ScriptBlock เดียวกันเข้ากับหลายคีย์และจำเป็นต้องดำเนินการที่แตกต่างกันโดยขึ้นอยู่กับคีย์ คุณสามารถตรวจสอบ$keyได้ การเชื่อมโยงแบบกำหนดเองจำนวนมากไม่สนใจอาร์กิวเมนต์นี้$arg- อาร์กิวเมนต์ที่กำหนดเอง โดยส่วนใหญ่ นี่จะเป็นอาร์กิวเมนต์จำนวนเต็มที่ผู้ใช้ส่งผ่านจากการโยงคีย์ DigitArgument หากการเชื่อมโยงของคุณไม่ยอมรับข้อโต้แย้ง ก็สมเหตุสมผลที่จะเพิกเฉยต่อข้อโต้แย้งนี้
ลองมาดูตัวอย่างที่เพิ่มบรรทัดคำสั่งลงในประวัติโดยไม่ต้องดำเนินการ สิ่งนี้มีประโยชน์เมื่อคุณรู้ว่าคุณลืมทำบางอย่าง แต่ไม่ต้องการป้อนบรรทัดคำสั่งที่คุณป้อนไว้แล้วอีกครั้ง
$parameters = @{
Key = 'Alt+w'
BriefDescription = 'SaveInHistory'
LongDescription = 'Save current line in history but do not execute'
ScriptBlock = {
param($key, $arg) # The arguments are ignored in this example
# GetBufferState gives us the command line (with the cursor position)
$line = $null
$cursor = $null
[Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line,
[ref]$cursor)
# AddToHistory saves the line in history, but does not execute it.
[Microsoft.PowerShell.PSConsoleReadLine]::AddToHistory($line)
# RevertLine is like pressing Escape.
[Microsoft.PowerShell.PSConsoleReadLine]::RevertLine()
}
}
Set-PSReadLineKeyHandler @parameters
คุณสามารถดูตัวอย่างเพิ่มเติมได้ในไฟล์ SamplePSReadLineProfile.ps1 ซึ่งติดตั้งอยู่ในโฟลเดอร์โมดูล PSReadLine
การผูกคีย์ส่วนใหญ่ใช้ฟังก์ชันตัวช่วยบางอย่างในการแก้ไขบรรทัดคำสั่ง API เหล่านั้นได้รับการบันทึกไว้ใน about_PSReadLine_Functions
หมายเหตุ
ประวัติคำสั่ง
PSReadLine จะเก็บรักษาไฟล์ประวัติซึ่งประกอบด้วยคำสั่งและข้อมูลทั้งหมดที่คุณป้อนจากบรรทัดคำสั่ง ไฟล์ประวัติเป็นไฟล์ชื่อ $ ($host.Name)_history.txt บนระบบ Windows ไฟล์ประวัติจะถูกเก็บไว้ที่ $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine บนระบบที่ไม่ใช่ Windows ไฟล์ประวัติจะถูกเก็บไว้ที่ $env:XDG_DATA_HOME/powershell/PSReadLine หรือ $env:HOME/.local/share/powershell/PSReadLine
ประวัติอาจมีข้อมูลที่ละเอียดอ่อนรวมถึงรหัสผ่าน PSReadLine พยายามกรองข้อมูลที่ละเอียดอ่อนออก บรรทัดคำสั่งใดๆ ที่มีสตริงต่อไปนี้จะไม่ถูกเขียนลงในไฟล์ประวัติ
passwordasplaintexttokenapikeysecretPSReadLine 2.2.0 ปรับปรุงการกรองข้อมูลที่ละเอียดอ่อน
- ใช้ PowerShell Abstract Syntax Tree (AST) ของบรรทัดคำสั่งที่แยกวิเคราะห์เพื่อค้นหาข้อมูลที่ละเอียดอ่อน
ใช้รายการที่อนุญาตของ cmdlet ที่ปลอดภัยจากโมดูล SecretManagement เพื่ออนุญาตให้เพิ่มคำสั่งเหล่านั้นลงในประวัติ รายการที่อนุญาตประกอบด้วย:
Get-Secret
Get-SecretInfoGet-SecretVaultRegister-SecretVaultRemove-SecretSet-SecretInfoSet-SecretVaultDefaultTest-SecretVaultUnlock-SecretVaultUnregister-SecretVaultตัวอย่างเช่น อนุญาตให้เขียนคำสั่งต่อไปนี้ลงในไฟล์ประวัติ:
Get-Secret PSGalleryApiKey -AsPlainText # Get-Secret is in the allowlist
$token = Get-Secret -Name github-token -Vault MySecret
[MyType]::CallRestAPI($token, $url, $args)
$template -f $token
คำสั่งต่อไปนี้ไม่ได้ถูกเขียนลงในไฟล์ประวัติ:
$token = 'abcd' # Assign expr-value to sensitive variable name.
Set-Secret abc $mySecret # Set-Secret is not in the allowlist.
ConvertTo-SecureString stringValue -AsPlainText # '-AsPlainText' is an alert.
Invoke-WebRequest -Token xxx # Expr-value as argument to '-Token'.
Get-ResultFromTwo -Secret1 (Get-Secret -Name blah -AsPlainText) -Secret2 sdv87ysdfayf798hfasd8f7ha # '-Secret2' has expr-value argument.
หากมีคำสั่งอื่นที่คุณไม่ต้องการเขียนลงในไฟล์ประวัติ คุณสามารถใช้พารามิเตอร์ AddToHistoryHandler ของ Set-PSReadLineOption cmdlet สำหรับตัวอย่างวิธีใช้ AddToHistoryHandler โปรดดูตัวอย่างที่ 7 ของ Set-PSReadLineOption
PSReadLine 2.3.4 ปรับปรุงการกรองข้อมูลที่ละเอียดอ่อน
ปรับปรุงการล้างประวัติที่ละเอียดอ่อนเริ่มต้นเพื่อให้ประวัติมีการเข้าถึงทรัพย์สินที่ปลอดภัย
เมื่อสตริงที่ละเอียดอ่อนเป็นส่วนหนึ่งของการเข้าถึงคุณสมบัติ:
- หากการดำเนินการเข้าถึงสมาชิกนี้ไม่ได้เป็นส่วนหนึ่งของการมอบหมาย เราจะถือว่าปลอดภัย
- มิฉะนั้นหากทางด้านขวามือเป็นไปป์ไลน์หรือตัวแปรเราก็ถือว่าปลอดภัยเช่นกัน
ตัวอย่างเช่น กรณีการใช้งานต่อไปนี้ถือว่าปลอดภัยและสามารถบันทึกลงในประวัติได้
$a.Secret = Get-Secret -Name github-token -Vault MySecret
$a.Secret = $secret
$a.Password.Secret | Set-Value
$token = (Get-AzAccessToken -ResourceUrl 'https://app.contoso.com').Token
นอกจากนี้ รุ่นนี้ยังปรับปรุงการขัดประวัติที่ละเอียดอ่อนเพื่อให้สามารถเรียกโทเค็นโดยใช้เครื่องมือบรรทัดคำสั่ง az, gcloud และ kubectl
ตัวอย่างเช่น กรณีการใช้งานต่อไปนี้ถือว่าปลอดภัยและสามารถบันทึกลงในประวัติได้
kubectl get secrets
kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode
kubectl describe secret db-user-pass
az account get-access-token --resource=https://app.contoso.com --query accessToken --output tsv
$env:PGPASS = gcloud auth print-access-token
ประวัติการเปิดตัว PSReadLine
มีการอัปเดตมากมายสำหรับ PSReadLine ตั้งแต่เวอร์ชันที่มาพร้อมกับ Windows PowerShell 5.1
- รุ่นปัจจุบันคือ PSReadLine 2.3.4
- PowerShell 7.4 มาพร้อมกับ PSReadLine 2.3.4
- PowerShell 7.3 มาพร้อมกับ PSReadLine 2.2.6
- PowerShell 7.2 มาพร้อมกับ PSReadLine 2.1.0
- PowerShell 7.0.11 มาพร้อมกับ PSReadLine 2.0.4
- PowerShell 5.1 มาพร้อมกับ PSReadLine 2.0.0
สำหรับรายการการเปลี่ยนแปลงทั้งหมด โปรดดู PSReadLine ChangeLog
- PSReadLine 2.3.4
นอกเหนือจากการแก้ไขข้อบกพร่องหลายประการแล้ว รุ่นนี้ยังมีการปรับปรุงดังต่อไปนี้:
ListView แบบเลื่อนได้สำหรับ Predictive IntelliSense
- ปรับขนาดอัตโนมัติตามขนาดของหน้าต่างเทอร์มินัล
- สามารถมีผลการทำนายได้ถึง 50 รายการ
- ส่วนหัวของรายการไดนามิกที่แสดงจำนวนผลลัพธ์และแหล่งที่มาของการทำนายปัจจุบัน
ปรับปรุงการขัดประวัติที่มีความละเอียดอ่อนเพื่อให้สามารถดึงโทเค็นจาก az, gcloud และ kubectl
ปรับปรุงการล้างประวัติที่ละเอียดอ่อนเริ่มต้นเพื่อให้สามารถเข้าถึงทรัพย์สินได้อย่างปลอดภัย
เพิ่มการรองรับคำที่ขึ้นลง ลดขนาด และการใช้อักษรตัวพิมพ์ใหญ่
ทำให้แท็บสมบูรณ์แสดงผลลัพธ์ที่ ListItemText แตกต่างกันตามกรณีเท่านั้น
รองรับคำสั่ง text-object <d,i,w> ในโหมดแก้ไข VI
เปลี่ยนสีเริ่มต้นสำหรับการคาดการณ์แบบอินไลน์เป็นสีสลัว
เพิ่มตัวอย่างไปที่ README เพื่อแปลงโค้ด Unicode ให้ชี้เป็น Unicode char โดย Alt+x
เพิ่มตัวเลือก TerminateOrphanedConsoleApps บน Windows เพื่อฆ่ากระบวนการที่แนบมากับคอนโซลที่ถูกละเลยซึ่งอาจทำให้การอ่านจากอินพุตคอนโซลยุ่ง
PSReadLine 2.2.6
ในรุ่นนี้ คุณสมบัติ Predictive IntelliSense จะถูกเปิดใช้งานตามค่าเริ่มต้น ขึ้นอยู่กับเงื่อนไขต่อไปนี้:
- หากรองรับ Virtual Terminal (VT) และ PSReadLine ทำงานใน PowerShell 7.2 หรือสูงกว่า PredictionSource จะถูกตั้งค่าเป็น
HistoryAndPlugin
Historyไม่มีPSReadLine 2.2.5
การให้บริการอย่างเป็นทางการพร้อมการแก้ไขข้อบกพร่องเล็กน้อย
PSReadLine 2.2.2
PSReadLine ได้เพิ่มคุณสมบัติการคาดการณ์ IntelliSense ใหม่สองประการ:
- เพิ่มพารามิเตอร์ PredictionViewStyle เพื่อให้สามารถเลือก
ListViewใหม่ได้
- เพิ่มพารามิเตอร์ PredictionViewStyle เพื่อให้สามารถเลือก
CommandPrediction ที่แนะนำใน PowerShell 7.2 เพื่อให้ผู้ใช้สามารถนำเข้าโมดูลตัวทำนายที่สามารถแสดงคำแนะนำจากแหล่งที่มาที่กำหนดเองได้Microsoft.PowerShell.Pager เวอร์ชัน 1.0.0 สำหรับความช่วยเหลือแบบไดนามิกPSReadLine 2.1.0
รุ่นนี้มีการปรับปรุงต่อไปนี้ที่เพิ่มเข้ามาตั้งแต่รุ่น 2.0.4:
- เพิ่มคำแนะนำ Predictive IntelliSense จากประวัติคำสั่ง
PSReadLine 2.0.4
รุ่นนี้มีการปรับปรุงต่อไปนี้ที่เพิ่มเข้ามาตั้งแต่รุ่น 2.0.0:
- เพิ่มพารามิเตอร์
-ChordในGet-PSReadLineKeyHandlerเพื่อให้สามารถค้นหาการเชื่อมโยงคีย์เฉพาะได้
ข้อเสนอแนะและการมีส่วนร่วมกับ PSReadLine
PSReadLine บน GitHub
อย่าลังเลที่จะส่งคำขอดึงหรือส่งข้อเสนอแนะในหน้า GitHub
ดูเพิ่มเติม
- PSReadLine ได้รับอิทธิพลอย่างมากจากไลบรารี readline ของ GNU