ตามค่าเริ่มต้น Windows PowerShell (เช่นเดียวกับ Command Prompt) บันทึกประวัติคำสั่งที่รันไว้เฉพาะในเซสชัน 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 และรันคำสั่งที่พิมพ์ไว้ก่อนหน้านี้ซ้ำได้
ใน PowerShell เวอร์ชันก่อนหน้า ประวัติคำสั่งในเซสชันปัจจุบันไม่ได้ถูกบันทึกหลังจากปิดแล้ว โดยใช้ปุ่ม up/down คุณสามารถเลื่อนดูประวัติคำสั่งของเซสชัน PS ปัจจุบันเท่านั้น หรือแสดงรายการประวัติคำสั่งทั้งหมดโดยใช้ Cmdlet Get-History
คุณสามารถแสดงข้อมูลโดยละเอียดเพิ่มเติมเกี่ยวกับคำสั่งที่รันไว้ก่อนหน้านี้ในเซสชัน 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 (Reverse Search) และ CTRL+S (Forward Search) กดชุดปุ่มและเริ่มพิมพ์ส่วนหนึ่งของคำสั่งที่คุณต้องการค้นหาในคำสั่งที่รันไว้ก่อนหน้านี้ ข้อความที่คุณป้อนจะถูกค้นหาในประวัติคำสั่งในตำแหน่งใดก็ได้ (ไม่เหมือนการค้นหาใน 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

ประวัติคำสั่งสามารถกำหนดค่าได้โดยใช้ Cmdlets Get-PSReadlineOption และ Set-PSReadlineOption การตั้งค่า PSReadline ปัจจุบันสามารถดูได้ด้วยคำสั่งนี้:
Get-PSReadlineOption | select HistoryNoDuplicates, MaximumHistoryCount, HistorySearchCursorMovesToEnd, HistorySearchCaseSensitive, HistorySavePath, HistorySaveStyle

การตั้งค่าพารามิเตอร์ PSReadline ต่อไปนี้อาจสำคัญสำหรับเรา:
- HistoryNoDuplicates – กำหนดว่าคำสั่งซ้ำกันต้องถูกบันทึกหรือไม่;
- MaximumHistoryCount – จำนวนคำสั่งสูงสุดที่จัดเก็บ (โดยค่าเริ่มต้นบันทึกคำสั่งล่าสุด 4096 คำสั่ง);
- HistorySearchCursorMovesToEnd — กำหนดว่าต้องไปที่ท้ายคำสั่งเมื่อค้นหาหรือไม่;
- HistorySearchCaseSensitive – กำหนดว่าการค้นหาเป็น Case Sensitive หรือไม่ (ประวัติคำสั่ง PS ไม่ใช่ Case Sensitive ตามค่าเริ่มต้น);
- HistorySavePath – แสดงพาธไปยังไฟล์ที่จัดเก็บคำสั่ง;
- HistorySaveStyle – กำหนดลักษณะการบันทึกคำสั่ง:
- SaveIncrementally — คำสั่งถูกบันทึกหลังจากรันเสร็จ (ค่าเริ่มต้น);
- SaveAtExit — ประวัติถูกบันทึกเมื่อปิดคอนโซล PowerShell;
- SaveNothing — ปิดใช้งานการบันทึกประวัติคำสั่ง
คุณสามารถเปลี่ยนการตั้งค่าของโมดูล PSReadLine โดยใช้ Set-PSReadlineOption ตัวอย่างเช่น:
Set-PSReadlineOption -HistorySaveStyle SaveAtExit

เพื่อเพิ่มจำนวนคำสั่ง PowerShell ที่บันทึกในไฟล์ล็อก ให้รันคำสั่ง:
Set-PSReadlineOption -MaximumHistoryCount 10000
ดังนั้น ความสามารถในการบันทึกประวัติคำสั่ง PowerShell ที่รันแล้ว คือหนึ่งในข้อโต้แย้งที่ชี้ให้เห็นว่า PoSh Console ดีกว่า Cmd
วิธีล้างประวัติคำสั่งคอนโซล PowerShell
ตามที่เราอธิบายไว้ข้างต้น โมดูล PSReadline บันทึกคำสั่งคอนโซล PowerShell ทั้งหมดลงในไฟล์ข้อความ อย่างไรก็ตาม ในบางกรณี ผู้ดูแลระบบต้องป้อนข้อมูลที่ละเอียดอ่อนต่างๆ ในคอนโซล PowerShell (ข้อมูลประจำตัว รหัสผ่าน ที่อยู่ ข้อมูลส่วนตัว ฯลฯ) ดังนั้น ผู้ดูแลระบบอีกคนหรือผู้โจมตีอาจเข้าถึงข้อมูลประวัติในไฟล์ข้อความธรรมดาได้ เพื่อเหตุผลด้านความปลอดภัย คุณอาจต้องล้างประวัติคำสั่ง PowerShell ที่รันแล้ว หรือปิดใช้งานประวัติคำสั่งโดยสิ้นเชิง
Cmdlet Clear-History สามารถใช้ได้เพื่อล้างประวัติคำสั่งในหน่วยความจำของเซสชัน PowerShell ปัจจุบันเท่านั้น มันล้างเฉพาะรายการคำสั่งก่อนหน้าที่ Cmdlet Get-History แสดง
คุณสามารถลบคำสั่งก่อนหน้าเพียงหนึ่งคำสั่งจากประวัติได้:
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 ไปยังโปรไฟล์ผู้ใช้บนคอมพิวเตอร์ที่ต้องการ
เพื่อส่งออกคำสั่งจากเซสชันปัจจุบันไปยังไฟล์ คุณสามารถใช้ Cmdlet Export-Clixml:
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 }