ตามค่าเริ่มต้น Windows PowerShell (เช่นเดียวกับพรอมต์คำสั่ง) จะบันทึกประวัติของคำสั่งที่ดำเนินการเฉพาะในเซสชัน PowerShell ปัจจุบันเท่านั้น เมื่อคุณปิดหน้าต่างคอนโซล PowerShell หรือรีสตาร์ทคอมพิวเตอร์ ประวัติของคำสั่ง PowerShell ที่คุณพิมพ์จะไม่ถูกบันทึกไว้ที่ใด เมื่อเทียบกับ bash นี่เป็นข้อเสียเปรียบที่สำคัญ เริ่มต้นด้วย PowerShell 5.0 เปิดตัวใน Windows 10 (Windows Server 2016) คำสั่งทั้งหมดที่ป้อนในคอนโซล PS จะถูกบันทึกลงในไฟล์บันทึกข้อความธรรมดาตามค่าเริ่มต้น
ประวัติคำสั่งใน PowerShell 5.0 และใหม่กว่า
สมมติว่าคุณพิมพ์และดำเนินการคำสั่ง PowerShell ที่ซับซ้อน ใน Windows 10 และ Windows Server 2016 แม้หลังจากรีสตาร์ทคอมพิวเตอร์แล้ว คุณยังสามารถเปิดเซสชัน PowerShell ใหม่และกดปุ่มลูกศรขึ้นได้ คำสั่งสุดท้ายที่คุณป้อนควรปรากฏบนหน้าจอ หากคุณกดปุ่ม "ขึ้น" ต่อไป คุณจะเห็นคำสั่งทั้งหมดที่ดำเนินการก่อนหน้านี้ ดังนั้น การใช้ปุ่ม “Up arrow
” และ “Down arrow
” คุณสามารถเลื่อนดูประวัติคำสั่ง PoSh และเรียกใช้คำสั่งที่พิมพ์ก่อนหน้านี้อีกครั้งได้
up
/down
คุณสามารถเลื่อนดูประวัติคำสั่งของเซสชัน PS ปัจจุบันเท่านั้น หรือแสดงรายการประวัติคำสั่งทั้งหมดโดยใช้ รับประวัติ cmdlet. คุณสามารถแสดงข้อมูลโดยละเอียดเพิ่มเติมเกี่ยวกับคำสั่งที่ดำเนินการก่อนหน้านี้ในเซสชัน PowerShell ปัจจุบัน รวมถึงสถานะคำสั่งและเวลาเริ่มต้น/สิ้นสุด/ระยะเวลา:
Get-History | Format-List -Property *
ตามค่าเริ่มต้น PowerShell ใน Windows 10 จะบันทึกคำสั่ง 4096 คำสั่งสุดท้ายที่เก็บอยู่ในไฟล์ข้อความธรรมดาที่อยู่ในโปรไฟล์ของผู้ใช้แต่ละราย %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
.
ประวัติจะถูกเก็บไว้แยกต่างหากสำหรับ PowerShell และ PowerShell ISE
หากคำสั่ง PowerShell ใช้เวลานานในการดำเนินการ คุณจะเห็นคำสั่งนั้นในประวัติคำสั่งเมื่อเสร็จสิ้นเท่านั้น
ใน cmd.exe คุณสามารถแสดงประวัติคำสั่งในเซสชันปัจจุบันด้วย:
doskey /history
F7
ใช้คีย์เพื่อค้นหาผ่านประวัติ cmd
จะค้นหาประวัติคำสั่ง PowerShell ได้อย่างไร
หากคุณไม่ต้องการเลื่อนดูประวัติคำสั่ง PowerShell ทั้งหมดโดยใช้ลูกศรขึ้น/ลง คุณสามารถค้นหาประวัติคำสั่งได้โดยใช้แป้นพิมพ์ลัด CTRL+R (ค้นหาแบบย้อนกลับ) และ CTR +S (ค้นหาไปข้างหน้า). กดคีย์ผสมและเริ่มพิมพ์ส่วนหนึ่งของคำสั่งที่คุณต้องการค้นหาในคำสั่งที่ดำเนินการก่อนหน้านี้ ข้อความที่คุณป้อนจะอยู่ในประวัติคำสั่งในตำแหน่งใดๆ (ต่างจากการค้นหาใน PowerShell โดยใช้ F8
หรือ Shift+F8
ซึ่งช่วยให้ค้นหาการแข่งขันจากจุดเริ่มต้นของบรรทัดเท่านั้น) คอนโซล PowerShell ควรแสดงคำสั่งก่อนหน้าที่สอดคล้องกับสตริงการค้นหา การจับคู่บรรทัดจะถูกเน้นในคำสั่ง
หากคำสั่งที่พบไม่เหมาะกับคุณ หากต้องการค้นหาประวัติต่อ ให้กด CTRL+R
/CTRL+S
อีกครั้ง. เป็นผลให้คำสั่งต่อไปนี้ที่สอดคล้องกับรูปแบบการค้นหาจะปรากฏขึ้นบนหน้าจอ
การใช้ F8
คุณจะพบคำสั่งในประวัติที่ตรงกับข้อความในบรรทัดคำสั่งปัจจุบัน ตัวอย่างเช่น ป้อน get-
แล้วกด F8
. จะพบรายการสุดท้ายในประวัติคำสั่งที่ตรงกับข้อความนี้ หากต้องการไปยังคำสั่งถัดไปในประวัติ ให้กด F8
อีกครั้ง
คุณยังสามารถใช้ #
ตัวอักษรเพื่อค้นหาผ่านประวัติคำสั่ง เช่น ค้นหาคำสั่งสุดท้ายที่ขึ้นต้นด้วย Get-WMI , พิมพ์ #get-wmi
แล้วกด Tab
กุญแจ. คำสั่งสุดท้ายที่ตรงกับรูปแบบจะปรากฏในคอนโซล:
ประวัติคำสั่งทำงานเหมือนกันทั้งใน Windows PowerShell แบบคลาสสิกและ PowerShell Core ใหม่ (หากคุณได้อัปเกรดเวอร์ชัน PoSh แล้ว)
ในการรับรายการคำสั่ง PoSh ก่อนหน้าในหน้าต่าง Notepad.exe ให้รันคำสั่ง:
notepad (Get-PSReadLineOption | select -ExpandProperty HistorySavePath)
หากต้องการแสดงรายการคำสั่งในประวัติที่ตรงกับการสืบค้น คุณสามารถใช้:
Get-History | Select-String -Pattern "Get-"
การจัดการประวัติคำสั่ง PowerShell ด้วยโมดูล PSReadLine
ฟังก์ชันประวัติคำสั่งใน PowerShell 5.0 ไม่ได้สร้างขึ้นใน Windows Management Framework เอง แต่อิงตาม PSReadLine ของบริษัทอื่น โมดูลซึ่งขยายการทำงานของคอนโซล PowerShell อย่างมาก PSReadLine ไฮไลต์ไวยากรณ์ในคอนโซล โดยมีหน้าที่เลือกข้อความด้วยเมาส์และคัดลอก/วางโดยใช้ CTRL+C
และ CTRL+V
. โมดูลนี้ใน Windows 10 อยู่ใน C:\Program Files\WindowsPowerShell\Modules\PSReadline และนำเข้าโดยอัตโนมัติเมื่อคอนโซล PowerShell เริ่มทำงาน
PSReadLine ไม่รวมอยู่ในโปรแกรมติดตั้ง PowerShell 5.0 แบบสแตนด์อโลน (หรือไม่มีเลย) สำหรับ Windows รุ่นก่อนหน้า ดังนั้น หากคุณต้องการใช้ฟังก์ชันประวัติคำสั่ง PowerShell ใน Windows เวอร์ชันก่อนหน้า (Windows 7/8.1 และ Windows Server 2008R2/2012R2) นอกเหนือจากการติดตั้ง Windows Management Framework 5.1 คุณจะต้องติดตั้งโมดูล PSReadLine ผ่านโมดูล PackageManagement (เดิมคือ OneGet) จากที่เก็บออนไลน์โดยใช้คำสั่ง:
Install-Module PSReadLine
รายการฟังก์ชันทั้งหมดของโมดูล PSReadLine สำหรับจัดการประวัติคำสั่งใน PowerShell และคีย์ที่ได้รับมอบหมายสามารถแสดงได้ด้วยคำสั่ง:
Get-PSReadlineKeyHandler | ? {$_.function -like '*hist*'}
Key Function Description --- -------- ----------- UpArrow PreviousHistory Replace the input with the previous item in the history DownArrow NextHistory Replace the input with the next item in the history Ctrl+r ReverseSearchHistory Search history backwards interactively Ctrl+s ForwardSearchHistory Search history forward interactively Alt+F7 ClearHistory Remove all items from the command line history (not PowerShell history) F8 HistorySearchBackward Search for the previous item in the history that starts with the current input - like NextHistory 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 Unbound ViSearchHistoryBackward Starts a new seach backward in the history. Unbound BeginningOfHistory Move to the first item in the history Unbound EndOfHistory Move to the last item (the current input) in the history
ประวัติคำสั่งสามารถกำหนดค่าได้โดยใช้ Get-PSReadlineOption และ Set-PSReadlineOption cmdlet สามารถดูการตั้งค่า PSReadline ปัจจุบันได้โดยใช้คำสั่งนี้:
Get-PSReadlineOption | select HistoryNoDuplicates, MaximumHistoryCount, HistorySearchCursorMovesToEnd, HistorySearchCaseSensitive, HistorySavePath, HistorySaveStyle
การตั้งค่าพารามิเตอร์ PSReadline ต่อไปนี้อาจมีความสำคัญสำหรับเรา:
- HistoryNoDuplicates – กำหนดว่าจะต้องบันทึกคำสั่งเดียวกันหรือไม่
- จำนวนประวัติสูงสุด – จำนวนสูงสุดของคำสั่งที่เก็บไว้ (โดยค่าเริ่มต้น คำสั่ง 4096 คำสั่งสุดท้ายจะถูกบันทึกไว้);
- HistorySearchCursorMovesToEnd — กำหนดว่าคุณต้องไปที่ท้ายคำสั่งเมื่อค้นหาหรือไม่
- HistorySearchCaseSensitive – กำหนดว่าการค้นหาคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่หรือไม่ (ประวัติคำสั่ง PS ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่โดยค่าเริ่มต้น);
- HistorySavePath – แสดงเส้นทางไปยังไฟล์ที่เก็บคำสั่ง;
- HistorySaveStyle – กำหนดลักษณะเฉพาะของคำสั่งบันทึก:
- บันทึกทีละส่วน — คำสั่งจะถูกบันทึกหลังจากรัน (โดยค่าเริ่มต้น);
- SaveAtExit — ประวัติจะถูกบันทึกเมื่อปิดคอนโซล PowerShell
- ไม่บันทึกสิ่งใด — ปิดใช้งานการบันทึกประวัติคำสั่ง
คุณสามารถเปลี่ยนการตั้งค่าของโมดูล PSReadLine ได้โดยใช้ Set-PSReadlineOption . ตัวอย่างเช่น:
Set-PSReadlineOption -HistorySaveStyle SaveAtExit
หากต้องการเพิ่มจำนวนคำสั่ง PowerShell ที่บันทึกไว้ในล็อกไฟล์ ให้เรียกใช้คำสั่ง:
Set-PSReadlineOption -MaximumHistoryCount 10000
ดังนั้น ความสามารถในการบันทึกประวัติของคำสั่ง PowerShell ที่ดำเนินการเป็นหนึ่งในอาร์กิวเมนต์ที่ต้องการให้คอนโซล PoSh เป็น cmd
จะล้างคำสั่งประวัติคอนโซล PowerShell ได้อย่างไร
ดังที่เราได้อธิบายไว้ข้างต้น โมดูล PSReadline จะบันทึกคำสั่งคอนโซล PowerShell ทั้งหมดลงในไฟล์ข้อความ อย่างไรก็ตาม ในบางกรณี ผู้ดูแลระบบต้องป้อนข้อมูลที่สำคัญต่างๆ ในคอนโซล PowerShell (ข้อมูลประจำตัว รหัสผ่าน ที่อยู่ ข้อมูลส่วนบุคคล ฯลฯ) ดังนั้นผู้ดูแลระบบเซิร์ฟเวอร์หรือผู้โจมตีรายอื่นจึงสามารถเข้าถึงข้อมูลประวัติในไฟล์ข้อความธรรมดาได้ ด้วยเหตุผลด้านความปลอดภัย คุณอาจต้องล้างประวัติของคำสั่ง PowerShell ที่ดำเนินการหรือปิดใช้งานประวัติคำสั่งโดยสมบูรณ์
ล้างประวัติ cmdlet สามารถใช้เพื่อล้างประวัติคำสั่งในหน่วยความจำของเซสชัน PowerShell ปัจจุบันเท่านั้น จะล้างเฉพาะรายการคำสั่งก่อนหน้าที่ Get-History cmdlet แสดง
คุณสามารถลบคำสั่งก่อนหน้าได้เพียงคำสั่งเดียวจากประวัติ:
Clear-History -count 1 -newest
หรือล้างคำสั่งทั้งหมดที่มีรูปแบบเฉพาะ:Clear-History -CommandLine *set-ad*
ในการล้างประวัติคำสั่ง PowerShell ก่อนหน้าโดยสมบูรณ์ คุณต้องลบไฟล์ ConsoleHost_history.txt ซึ่งเขียนโดยโมดูล PSReadline คุณสามารถรับตำแหน่งไฟล์ประวัติ PowerShell ปัจจุบันและลบออกได้ด้วยคำสั่ง:
Remove-Item (Get-PSReadlineOption).HistorySavePath
หลังจากนั้น ปิดหน้าต่างคอนโซล PowerShell
หากคุณต้องการปิดใช้งานการบันทึกประวัติของคำสั่ง PowerShell ลงในไฟล์ข้อความโดยสมบูรณ์ ให้เรียกใช้คำสั่ง:
Set-PSReadlineOption -HistorySaveStyle SaveNothing
จะส่งออก/นำเข้าประวัติคำสั่ง PowerShell ไปยังเซสชันอื่นได้อย่างไร
บางครั้งก็สะดวกที่จะมีชุดคำสั่ง PowerShell ที่ใช้บ่อยชุดเดียวกันบนคอมพิวเตอร์หลายเครื่อง คุณสามารถส่งออกประวัติคำสั่งปัจจุบันบนคอมพิวเตอร์ของคุณไปยังไฟล์ xml และนำเข้าไปยังคอมพิวเตอร์เครื่องอื่นได้ นอกจากนี้ยังสามารถทำได้โดยการคัดลอกไฟล์ ConsoleHost_history.txt ไปยังโปรไฟล์ผู้ใช้ในคอมพิวเตอร์ที่ต้องการ
ในการส่งออกคำสั่งจากเซสชันปัจจุบันไปยังไฟล์ คุณสามารถใช้ Export-Clixml
cmdlet:
Get-History | Export-Clixml -Path c:\ps\commands_hist.xml
ในการนำเข้าประวัติคำสั่งจากไฟล์ไปยังเซสชัน PoSh อื่น (บนคอมพิวเตอร์เครื่องอื่น):
Add-History -InputObject (Import-Clixml -Path c:\ps\commands_hist.xml)
ในการส่งออกคำสั่งก่อนหน้าไปยังไฟล์โดยอัตโนมัติเมื่อสิ้นสุดเซสชัน PowerShell คุณสามารถผูกสคริปต์กับเหตุการณ์การสิ้นสุดเซสชัน PoSh ได้ (!! เซสชันต้องสิ้นสุดด้วย exit
คำสั่ง แทนที่จะเพียงแค่ปิดหน้าต่าง PowerShell):
$HistFile = Join-Path ([Environment]::GetFolderPath('UserProfile')) .ps_history
Register-EngineEvent PowerShell.Exiting -Action { Get-History | Export-Clixml $HistFile } | out-null
if (Test-path $HistFile) { Import-Clixml $HistFile | Add-History }