História príkazov v relácii PowerShell

Windows PowerShell (podobne ako príkazový riadok cmd) spočiatku ukladá históriu vykonaných príkazov iba v aktuálnej relácii PowerShell, keď zatvoríte okno konzoly PowerShell alebo reštartujete počítač, história príkazov PowerShell, ktoré ste zadali, sa nikde neuloží. V porovnaní s bash je to výrazná nevýhoda. V PowerShell v5 predstavenom vo Windows 10 bola táto chyba odstránená.

obsah:

  • História príkazov v PowerShell 5.0, modul PSReadLine
  • Vymazanie histórie príkazov v PowerShell
  • Importujte históriu príkazov PowerShell do inej relácie

História príkazov v PowerShell 5.0, modul PSReadLine

Predpokladajme, že napíšete a vykonáte nejaký zložitý príkaz PowerShell. V systéme Windows 10 a Windows Server 2016 môžete aj po reštartovaní počítača otvoriť novú reláciu PowerShell a stlačiť kláves so šípkou nahor. Na obrazovke by sa mal zobraziť posledný zadaný príkaz. Ak budete pokračovať v stlačení klávesu hore, uvidíte všetky predtým vykonané príkazy. Pomocou klávesov hore a dole sa teda môžete posúvať v histórii príkazov a znova vykonávať predtým zadané príkazy.

V predchádzajúcich verziách PowerShell sa história príkazov v aktuálnej relácii neukončila po jej zatvorení. Pomocou klávesov nahor / nadol môžete prechádzať históriou príkazov v aktuálnej relácii alebo ich všetky zobraziť naraz pomocou rutiny cmdlet. dostať-histórie.

Môžete zobraziť podrobnejšie informácie o predtým vykonaných príkazoch vrátane stavu a času začiatku / konca príkazu:
Get-History | Zoznam formátov - Majetok *

PowerShell v systéme Windows 10 si predvolene pamätá posledných 4096 príkazov, ktoré sú uložené v textovom súbore umiestnenom v profile každého používateľa

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

. História sa uchováva osobitne pre konzolu PowerShell, osobitne pre ISE.

Spustený príkaz PowerShell sa dostane do histórie až po jeho dokončení. Ak vykonanie príkazu PoSh trvá dlho, uvidíte ho v histórii príkazov až po jeho dokončení..

V prípade, že nechcete posúvať celú históriu príkazov PowerShell, môžete prehľadať históriu príkazov pomocou klávesovej skratky CTRL+R (spätné vyhľadávanie) a CTRL+S (hľadať vpred). Stlačte kombináciu klávesov a začnite písať časť príkazu, ktorú chcete nájsť v predtým vykonaných príkazoch. História príkazov bude hľadať zadaný text na ľubovoľnej pozícii (na rozdiel od vyhľadávania v konzole PowerShell pomocou klávesov F8 alebo Shift + F8, ktoré hľadajú zhody iba od začiatku riadku) a príslušná možnosť sa zvýrazní..

poznámka. Funkcia protokolovania príkazov v PowerShell 5 nie je zabudovaná do samotného Windows Management Framework, ale je založená na module tretej strany. PSReadLine, výrazne rozširuje funkčnosť konzoly PowerShell. Vo Windows 10 je v adresári C: \ Program súbory\ WindowsPowerShell\ Moduly\ PSReadline a automaticky sa importuje pri spustení konzoly PowerShell. PSReadLine poskytuje zvýraznenie syntaxe v konzole, je zodpovedný za schopnosť používať výber textu pomocou myši a kopírovať / vložiť pomocou CTRL + C a CTRL + V. PSReadLine nie je súčasťou osobitne nainštalovaného PowerShell 5 pre predchádzajúce verzie systému Windows. Ak teda chcete používať funkciu protokolovania výkonu vykonaných príkazov PowerShell v predchádzajúcich verziách OS (Windows 7 / 8.1 / Windows Server 2008 / R2 / 2012R2), okrem inštalácie Windows Management Framework 5.1, budete musieť nainštalovať modul PSReadLine pomocou správcu balíkov PackageManagement (predtým OneGet) z online úložiska s príkazom:

Inštalačný modul PSReadLine

Kompletný zoznam funkcií modulu PSReadLine pre správu histórie vykonávania príkazu v PowerShell a kľúčov k nim pripojených je možné zobraziť pomocou príkazu:

Get-PSReadlineKeyHandler | ? $ _. funkčné '* hist *'

Opis kľúčových funkcií
---       --------             -----------
Opis kľúčových funkcií
---       --------                -----------
Nahor Predchádzajúca história Nahradenie zadaných údajov predchádzajúcou položkou denníka
DownArrow NextHistory Nahraďte svoje záznamy ďalšou položkou denníka
Ctrl + R ReverseSearchHistory Vykonajte interaktívne vyhľadávanie protokolov v opačnom poradí
Ctrl + S ForwardSearchHistory Vykonajte interaktívne vyhľadávanie protokolov v smere dopredu
Alt + F7 ClearHistory Odstránenie všetkých položiek z denníka príkazového riadku (nie z denníka PowerShell)
F8 HistorySearchBackward Vyhľadá predchádzajúcu položku denníka, ktorá začína aktuálnym vstupom, napríklad P ...
Shift + F8 HistorySearchForward Vyhľadá ďalšiu položku denníka, ktorá začína aktuálnym vstupom, napríklad Ne ...
Unbound ViSearchHistoryBackward Spustí nové hľadanie protokolu dozadu.
Unbound BeginningOfHistory Prejdite na prvú položku denníka
Bez obmedzenia EndOfHistory Prejdite na poslednú položku (aktuálny vstup) v denníku

História príkazov sa konfiguruje pomocou cmdletov dostať-PSReadlineOption a sada-PSReadlineOption. Aktuálne nastavenie je možné získať pomocou tohto návrhu:

Get-PSReadlineOption | vyberte HistoryNoDuplikáty, MaximumHistoryCount, HistorySearchCursorMovesToEnd, HistorySearchCaseSensitive, HistorySavePath, HistorySaveStyle

Možno nás budú zaujímať nastavenia nasledujúcich parametrov:

  • HistoryNoDuplicates - Musím si zachovať rovnaké príkazy v histórii PowerShell?
  • MaximumHistoryCount - maximálny počet uložených príkazov (štandardne je uložených 4096 príkazov);
  • HistorySearchCursorMovesToEnd - či má ísť pri vyhľadávaní na koniec príkazu;
  • HistorySearchCaseSensitive - či pri vyhľadávaní treba rozlišovať malé a veľké písmená;
  • HistorySavePath - cesta k textovému súboru, do ktorého sa ukladá história príkazov PowerShell;
  • HistorySaveStyle - vlastnosti ukladania príkazov:
    • SaveIncrementally - príkazy sa ukladajú počas vykonávania (predvolene)
    • SaveAtExit - ukladanie histórie pri zatváraní konzoly
    • SaveNothing - zakáže históriu príkazov

Nastavenia modulu PSReadLine môžete zmeniť príkazom Set-PSReadlineOption, napríklad:

Set-PSReadlineOption -HistorySaveStyle SaveAtExit

Schopnosť uložiť históriu vykonaných príkazov v PowerShell 5.0 je ďalším argumentom pre opustenie cmd v prospech konzoly PoSh..

Vymazanie histórie príkazov v PowerShell

Ako sme opísali vyššie, modul PSReadline ukladá všetky príkazy konzoly PowerShell do textového súboru. V niektorých prípadoch však môže správca musieť do konzoly PowerShell zadať rôzne dôverné informácie (poverenia, heslá, adresy, osobné údaje atď.). Iný správca servera alebo útočník má teda prístup k údajom v textovom súbore. Z bezpečnostných dôvodov bude možno potrebné vyčistiť protokol príkazov PowerShell alebo úplne zakázať históriu príkazov.

cmdlet Vymazať históriu nemožno použiť na vymazanie histórie príkazov, pretože vymaže iba zoznam predchádzajúcich príkazov, ktoré sa zobrazia v rutiny Get-History.

Ak chcete vymazať históriu predchádzajúcich príkazov PoSh, musíte odstrániť súbor, do ktorého sú uložené. Najjednoduchší spôsob, ako to dosiahnuť, je pomocou príkazu:

Odstrániť položku (Get-PSReadlineOption) .HistorySavePath

Potom ukončite reláciu PoSh:

Ak chcete úplne zakázať ukladanie histórie príkazov PoSh do textového súboru, spustite príkaz:

Set-PSReadlineOption -HistorySaveStyle SaveNothing

Importujte históriu príkazov PowerShell do inej relácie

V niektorých prípadoch je vhodné mať k dispozícii jeden alebo ten istý zoznam často používaných príkazov PowerShell na rôznych počítačoch. Môžete exportovať aktuálnu históriu príkazov do súboru xml a importovať ich do iných počítačov. To je možné dosiahnuť kopírovaním súboru ConsoleHost_history.txt do užívateľských profilov na potrebných počítačoch..

Pomocou príkazu Export-Clixml cmdlet môžete exportovať príkazy z aktuálnej relácie do súboru:

Get-History | Export-Clixml - Cesta c: \ ps \ orders_hist.xml

Ak chcete importovať príkazy zo súboru do relácie PoSh:

Add-History --InputObject (Import-Clixml - Cesta c: \ ps \ orders_hist.xml)

Ak chcete automaticky importovať príkazy do súboru na konci relácie PoSh, môžete skript prepojiť s udalosťou ukončenia relácie PoSh (!! Relácia musí skončiť príkazom exit a nielen zatvoriť okno PoSh):

$ HistFile = Pripojiť sa ([Prostredie] :: GetFolderPath ('UserProfile')) .ps_history
Register-EngineEvent PowerShell.Exiting -Action Get-History | Exportovať Clixml $ HistFile | out-null
if (Testovacia cesta $ HistFile) Import-Clixml $ HistFile | Add-History