שימוש בהיסטוריית פקודות קודמת במסוף PowerShell


כברירת מחדל, Windows שומר את כל הפקודות שאתה מקליד במסוף PowerShell בקובץ יומן רישום של טקסט. פעולה זו מאפשרת לך להפעיל מחדש כל פקודה ולהציג את ההיסטוריה של פקודות PowerShell שהפעלת, גם לאחר סגירת הקונסולה או הפעלה מחדש של המחשב. PowerShell משתמש כעת בשני ספקי היסטוריית פקודות: היסטוריית הפקודות בהפעלה הנוכחית (המוצגת על-ידי ה- cmdlet Get-History) ויומן טקסט עם פקודות קודמות שמודול PSReadLine שומר.

הצגת היסטוריית פקודות PowerShell ב- Windows

במסוף PowerShell, הפקודה האחרונה שהקלדת מופיעה בעת הקשה על המקש למעלה. אם תמשיך ללחוץ על מקש "למעלה ", תראה את כל הפקודות שבוצעו קודם לכן. לפיכך, באמצעות "

Up arrow

" ו- "

Down arrow

" מקשים באפשרותך לגלול בהיסטוריה של פקודות PowerShell ולהפעיל מחדש פקודות שהוקלדו בעבר. אפשרות זו שימושית אם עליך לבצע במהירות אחת מהפקודות הקודמות מבלי להקליד אותה שוב.

מסוף PowerShell שומר היסטוריית פקודות מלאה מאז Windows PowerShell 5.1 (מותקן כברירת מחדל ב- Windows 10). בגירסאות קודמות של Windows PowerShell (ובשורת הפקודה cmd), ההיסטוריה של פקודות שבוצעו זמינה רק בהפעלה הנוכחית של PowerShell. השתמש ב- cmdlet Get-History כדי להציג את ההיסטוריה של פקודות קודמות בהפעלה הנוכחית.

באפשרותך להציג מידע מפורט יותר אודות פקודות שבוצעו בעבר בהפעלה הנוכחית של PowerShell, כולל מצב הפקודה וזמן התחלה/סיום/משך:

Get-History | Format-List -Property *

באפשרותך להפעיל את הפקודה הקודמת לפי המזהה שלה:

Invoke-History 6

היסטוריית הפקודות מאופסת והרשימה ב- Get-History מנוקה בעת סגירת מסוף PowerShell.

עם זאת, Windows PowerShell 5.1 ו- PowerShell Core שומרים גם את 4096 הפקודות האחרונות בקובץ טקסט רגיל בפרופיל של כל משתמש

%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

באפשרותך לפתוח קובץ זה ולהציג את היסטוריית הפקודות באמצעות כל עורך טקסט. לדוגמה, כדי לפתוח קובץ יומן פקודות באמצעות פנקס רשימות:

notepad (Get-PSReadLineOption | select -ExpandProperty HistorySavePath)

יומן ההיסטוריה נשמר בנפרד עבור מסוף PowerShell ועבור PowerShell ISE.

ב- 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 שלך). באפשרותך להשתמש במנהל החבילות המוכלל של WinGet ב- Windows 11 וב- Windows 10 כדי לעדכן במהירות את גירסת PowerShell שברשותך:

winget install --id=Microsoft.PowerShell -e

כדי להציג רשימה של פקודות בהיסטוריה התואמות לשאילתה, באפשרותך להשתמש ב:

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

ו:

Get-Content (Get-PSReadlineOption).HistorySavePath| Select-String -Pattern "Get-"

ניתן להשתמש ב- cmdlet Select-String ב- PowerShell בדיוק כמו הפקודה grep ב- Linux.

קביעת תצורה של היסטוריית פקודות PowerShell באמצעות מודול PSReadLine

פונקציונליות היסטוריית הפקודות ב- PowerShell אינה מובנית במסגרת הניהול של Windows עצמה, אלא מבוססת על מודול PSReadLine, אשר משפר מאוד את הפונקציונליות של מסוף PowerShell. מודול PSReadLine ב- Windows ממוקם בתיקיה C:\Program Files\WindowsPowerShell\Modules\PSReadline והוא מיובא באופן אוטומטי בעת הפעלת מסוף PowerShell.

PSReadLine מספק הדגשת תחביר בקונסולה, אחראי על היכולת להשתמש בבחירת טקסט עם העכבר והעתק/הדבק שלו באמצעות

CTRL+C

ו

CTRL+V

ודא שהמודול נטען בהפעלת PowerShell הנוכחית שלך:

Get-Module

אם מודול PSReadline לא נטען, ודא שהוא מותקן. במידת הצורך, התקן אותו מהמאגר המקוון של PowerShell Gallery:

Get-Module -ListAvailable | where {$_.name -like "*PSReadline*"}
Install-Module PSReadLine

באפשרותך גם להתקין באופן ידני את מודול PowerShell במצב לא מקוון.

רשימה מלאה של פונקציות של מודול 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 במודול PSReadLine:

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

ייתכן שתרצה לשקול את הפרמטרים הבאים של PSReadline:

  • HistoryNoDuplicates - האם יש לשמור את אותן פקודות;

  • MaximumHistoryCount - המספר המרבי של הפקודות המאוחסנות (כברירת מחדל נשמרות 4096 הפקודות האחרונות);

  • HistorySearchCursorMovesToEnd — האם יש צורך לקפוץ לסוף הפקודה בעת חיפוש;

  • istorySearchCaseSensitive - האם החיפוש תלוי רישיות (היסטוריית פקודות PowerShell אינה תלוית רישיות כברירת מחדל);

  • HistorySavePath - נתיב לקובץ טקסט שבו מאוחסנת ההיסטוריה של פקודות PowerShell;;

  • HistorySaveStyle - אפשרויות שמירת היסטוריית פקודות:

    • שמורבהדרגה — הפקודות נשמרות בעת ביצוען (כברירת מחדל);

    • SaveAtExit —ההיסטוריה נשמרת בעת סגירת מסוף PowerShell;

    • SaveNothing — השבת את שמירת היסטוריית הפקודות.

באפשרותך לשנות את הגדרות מודול PSReadLine באמצעות הפקודה Set-PSReadlineOption. לדוגמה, כדי להגדיל את מספר פקודות PowerShell המאוחסנות ביומן:

Set-PSReadlineOption -MaximumHistoryCount 10000

אם ברצונך לשמור לא רק את הפקודות שבוצעו אלא גם את הפלט שלהן בהיסטוריית הפקודות של PowerShell, באפשרותך להפעיל תמלול פקודות. פשוט הוסף את הפונקציה הבאה לפרופיל PowerShell של המשתמש (

notepad $profile.CurrentUserAllHosts

):

Function StartTranscript {
Trap {
Continue
}
$TranScriptFolder = $($(Split-Path $profile) + '\TranscriptLog\')
if (!(Test-Path -Path $TranScriptFolder )) { New-Item -ItemType directory -Path $TranScriptFolder }
Start-Transcript -Append ($($TranScriptFolder + $(get-date -format 'yyyyMMdd-HHmmss') + '.txt')) -ErrorVariable Transcript -ErrorAction stop
}
StartTranscript

פרופיל המשתמש מכיל כעת קובץ יומן רישום מפורט עבור כל הפעלת PowerShell ב-

%USERPROFILE%\Documents\WindowsPowerShell\TranscriptLog

מדריך.

כיצד להפעיל פקודה PowerShell מבלי לשמור אותה בהיסטוריה?

במעטפת ה- bash של לינוקס, באפשרותך להשבית את ההיסטוריה עבור פקודות המתחילות ברווחים (עם

HISTCONTROL= ignorespace

). באפשרותך להגדיר אופן פעולה דומה עבור PowerShell.

לשם כך, הוסף את הקוד הבא לפרופיל PowerShell של המשתמש הנוכחי (

$profile.CurrentUserAllHosts

):

Set-PSReadLineOption -AddToHistoryHandler {
    param($command)
    if ($command -like ' *') {
        return $false
    }
    return $true
} 

תכונה זו דורשת שתגדיר את מדיניות ביצוע PowerShell במחשב שלך ל- Remotesigned:

Set-ExecutionPolicy Remotesigned

כעת, פשוט הפעל את הפקודה שלך עם רווח אם אינך מעוניין שהיא תישמר בהיסטוריית הפקודות של PowerShell.

כמו כן, החל מגירסת מודול Readline v2.0.4, המערכת מתעלמת באופן אוטומטי מפקודות המכילות את מילות המפתח הבאות ולא נשמרת בהיסטוריה:

Password

,

Asplaintext

,

Token

,

Apikey

,

Secret

. יחד עם זאת, רכיבי cmdlet ממודול ניהול הסיסמאות SecretManagement נחשבים בטוחים ומותר לשמור אותם בקובץ ההיסטוריה.

שימוש ב- IntelliSense חזוי עם היסטוריית פקודות של PowerShell

תכונה חדשה של PowerShell Predictive IntelliSense זמינה ב- PSReadLine 2.2.2+ . תכונה זו מציגה את הפקודות המתאימות ביותר מהיסטוריית הפקודות המקומית בעת הקלדת פקודה במסוף PowerShell.

בדוגמה זו, הקלדתי

get-wm

בקונסולה, ו- Predictive IntelliSense הציע אחת מהפקודות שהקלדתי קודם לכן שתאמה את הקלט שלי. אם פקודה זו מתאימה לי, עליי ללחוץ על הלחצן

right arrow key

כדי לקבל פקודה זו ולא להקליד את שאר התווים באופן ידני.

כברירת מחדל, רמזי IntelliSense חזוי מוצגים בטקסט אפור וקשה לקרוא אותם על רקע שחור של מסוף PowerShell. פקודה זו הופכת את הטקסט המוצע למנוגד יותר:

Set-PSReadLineOption -Colors @{ InlinePrediction = '#7A957B'}

מאז PSReadLine 2.2.6, Predictive IntelliSense מופעל כברירת מחדל. באפשרותך להפעיל אותו באופן ידני:

Set-PSReadLineOption -PredictionSource History

כדי לאפס את הצעת החיזוי של IntelliSense, הקש על מקש Esc.

באפשרותך לעבור לתצוגה אחרת על-ידי הקשה על מקש F2. כעת, במקום להציג פקודה אחת המתאימה ביותר (

InlineView 

), תוצג רשימה נפתחת עם כל הפקודות הדומות (

ListView

).

השתמש במקשים למעלה/למטה כדי לבחור במהירות פקודה דרושה לך מהיסטוריית הפקודות.

IntelliSense החיזוי פועל בשורת הפקודה הסטנדרטית pwsh.exe/powershell.exe, וכן בקוד מסוף Windows ו- Visual Studio.

כיצד לנקות את היסטוריית הפקודות ב- PowerShell?

כפי שהסברנו לעיל, מודול PSReadline שומר את כל פקודות מסוף PowerShell לקובץ טקסט. עם זאת, במקרים מסוימים, מנהל המערכת צריך להזין מידע רגיש שונים לתוך מסוף PowerShell (אישורים, סיסמאות, אסימונים, כתובות, נתונים אישיים וכו '). מנהל שרת או תוקף אחר יכול לגשת לנתוני היסטוריה בקובץ טקסט רגיל. מטעמי אבטחה, ייתכן שיהיה עליך לנקות את ההיסטוריה של פקודות PowerShell שהפעלת או לבטל את היסטוריית הפקודות לחלוטין.

ה- cmdlet Clear-History מאפשר לך לנקות את ההיסטוריה של פקודות רק בהפעלה הנוכחית של PowerShell. הוא מוחק רק את רשימת הפקודות הקודמת שמחזיר 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 בפרופיל המשתמש למחשבי היעד.

באפשרותך גם להשתמש בלחצן

Export-Clixml

פקודת cmdlet

כדי לייצא היסטוריית פקודות מההפעלה הנוכחית לקובץ טקסט:

Get-History | Export-Clixml -Path c:\ps\commands_hist.xml

כדי לייבא היסטוריית פקודות מקובץ להפעלה אחרת של PowerShell (במחשב מקומי או במחשב אחר):

Add-History -InputObject (Import-Clixml -Path c:\ps\commands_hist.xml)

כדי לייצא באופן אוטומטי את הפקודות הקודמות לקובץ כאשר הפעלת PowerShell מסתיימת, באפשרותך לאגד את קובץ ה- Script לאירוע סיום הפעלת PoSh (!! יש לסיים את הפגישה עם

exit

פקודה, r, לא פשוט על ידי סגירת מסוף 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 }