Computer >> คอมพิวเตอร์ >  >> ระบบ >> Windows Server

ประวัติคำสั่งก่อนหน้าใน PowerShell Console

ตามค่าเริ่มต้น 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 และเรียกใช้คำสั่งที่พิมพ์ก่อนหน้านี้อีกครั้งได้

ใน PowerShell เวอร์ชันก่อนหน้า ประวัติของคำสั่งในเซสชันปัจจุบันจะไม่ถูกบันทึกหลังจากปิด การใช้ up /down คุณสามารถเลื่อนดูประวัติคำสั่งของเซสชัน PS ปัจจุบันเท่านั้น หรือแสดงรายการประวัติคำสั่งทั้งหมดโดยใช้ รับประวัติ cmdlet.

คุณสามารถแสดงข้อมูลโดยละเอียดเพิ่มเติมเกี่ยวกับคำสั่งที่ดำเนินการก่อนหน้านี้ในเซสชัน PowerShell ปัจจุบัน รวมถึงสถานะคำสั่งและเวลาเริ่มต้น/สิ้นสุด/ระยะเวลา:

Get-History | Format-List -Property *

ประวัติคำสั่งก่อนหน้าใน PowerShell Console

ตามค่าเริ่มต้น PowerShell ใน Windows 10 จะบันทึกคำสั่ง 4096 คำสั่งสุดท้ายที่เก็บอยู่ในไฟล์ข้อความธรรมดาที่อยู่ในโปรไฟล์ของผู้ใช้แต่ละราย %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt .

ประวัติจะถูกเก็บไว้แยกต่างหากสำหรับ PowerShell และ PowerShell ISE

ประวัติคำสั่งก่อนหน้าใน PowerShell Console

หากคำสั่ง PowerShell ใช้เวลานานในการดำเนินการ คุณจะเห็นคำสั่งนั้นในประวัติคำสั่งเมื่อเสร็จสิ้นเท่านั้น

ใน cmd.exe คุณสามารถแสดงประวัติคำสั่งในเซสชันปัจจุบันด้วย:

doskey /history

F7 ใช้คีย์เพื่อค้นหาผ่านประวัติ cmd

ประวัติคำสั่งก่อนหน้าใน PowerShell Console

จะค้นหาประวัติคำสั่ง PowerShell ได้อย่างไร

หากคุณไม่ต้องการเลื่อนดูประวัติคำสั่ง PowerShell ทั้งหมดโดยใช้ลูกศรขึ้น/ลง คุณสามารถค้นหาประวัติคำสั่งได้โดยใช้แป้นพิมพ์ลัด CTRL+R (ค้นหาแบบย้อนกลับ) และ CTR +S (ค้นหาไปข้างหน้า). กดคีย์ผสมและเริ่มพิมพ์ส่วนหนึ่งของคำสั่งที่คุณต้องการค้นหาในคำสั่งที่ดำเนินการก่อนหน้านี้ ข้อความที่คุณป้อนจะอยู่ในประวัติคำสั่งในตำแหน่งใดๆ (ต่างจากการค้นหาใน PowerShell โดยใช้ F8 หรือ Shift+F8 ซึ่งช่วยให้ค้นหาการแข่งขันจากจุดเริ่มต้นของบรรทัดเท่านั้น) คอนโซล PowerShell ควรแสดงคำสั่งก่อนหน้าที่สอดคล้องกับสตริงการค้นหา การจับคู่บรรทัดจะถูกเน้นในคำสั่ง

หากคำสั่งที่พบไม่เหมาะกับคุณ หากต้องการค้นหาประวัติต่อ ให้กด CTRL+R /CTRL+S อีกครั้ง. เป็นผลให้คำสั่งต่อไปนี้ที่สอดคล้องกับรูปแบบการค้นหาจะปรากฏขึ้นบนหน้าจอ

ประวัติคำสั่งก่อนหน้าใน PowerShell Console

การใช้ F8 คุณจะพบคำสั่งในประวัติที่ตรงกับข้อความในบรรทัดคำสั่งปัจจุบัน ตัวอย่างเช่น ป้อน get- แล้วกด F8 . จะพบรายการสุดท้ายในประวัติคำสั่งที่ตรงกับข้อความนี้ หากต้องการไปยังคำสั่งถัดไปในประวัติ ให้กด F8 อีกครั้ง

ประวัติคำสั่งก่อนหน้าใน PowerShell Console

คุณยังสามารถใช้ # ตัวอักษรเพื่อค้นหาผ่านประวัติคำสั่ง เช่น ค้นหาคำสั่งสุดท้ายที่ขึ้นต้นด้วย Get-WMI , พิมพ์ #get-wmi แล้วกด Tab กุญแจ. คำสั่งสุดท้ายที่ตรงกับรูปแบบจะปรากฏในคอนโซล:

ประวัติคำสั่งก่อนหน้าใน PowerShell Console

ประวัติคำสั่งทำงานเหมือนกันทั้งใน Windows PowerShell แบบคลาสสิกและ PowerShell Core ใหม่ (หากคุณได้อัปเกรดเวอร์ชัน PoSh แล้ว)

ในการรับรายการคำสั่ง PoSh ก่อนหน้าในหน้าต่าง Notepad.exe ให้รันคำสั่ง:

notepad (Get-PSReadLineOption | select -ExpandProperty HistorySavePath)

ประวัติคำสั่งก่อนหน้าใน PowerShell Console หากต้องการแสดงรายการคำสั่งในประวัติที่ตรงกับการสืบค้น คุณสามารถใช้:

Get-History | Select-String -Pattern "Get-"

ประวัติคำสั่งก่อนหน้าใน PowerShell Console

การจัดการประวัติคำสั่ง 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

ประวัติคำสั่งก่อนหน้าใน PowerShell Console

ประวัติคำสั่งสามารถกำหนดค่าได้โดยใช้ Get-PSReadlineOption และ Set-PSReadlineOption cmdlet สามารถดูการตั้งค่า PSReadline ปัจจุบันได้โดยใช้คำสั่งนี้:

Get-PSReadlineOption | select HistoryNoDuplicates, MaximumHistoryCount, HistorySearchCursorMovesToEnd, HistorySearchCaseSensitive, HistorySavePath, HistorySaveStyle

ประวัติคำสั่งก่อนหน้าใน PowerShell Console

การตั้งค่าพารามิเตอร์ PSReadline ต่อไปนี้อาจมีความสำคัญสำหรับเรา:

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

คุณสามารถเปลี่ยนการตั้งค่าของโมดูล PSReadLine ได้โดยใช้ Set-PSReadlineOption . ตัวอย่างเช่น:

Set-PSReadlineOption -HistorySaveStyle SaveAtExit

ประวัติคำสั่งก่อนหน้าใน PowerShell Console

หากต้องการเพิ่มจำนวนคำสั่ง 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 Console

จะส่งออก/นำเข้าประวัติคำสั่ง 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 Console

ในการส่งออกคำสั่งก่อนหน้าไปยังไฟล์โดยอัตโนมัติเมื่อสิ้นสุดเซสชัน 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 }