Automatycznie eksportuj historię na koniec sesji PowerShell

5

Mogę eksportować historię Powershell za pomocą skryptów przedstawionych na stronie Technet na ten temat ,

Get-History | Export-Clixml ~\PowerShell\history.xml

i mogę automatycznie załadować zapisaną historię po uruchomieniu sesji PowerShell przy użyciu tego wiersza w moim profilu PowerShell,

Import-Clixml ~\PowerShell\history.xml | Add-History

Ale czy jest jakiś sposób na automatyczne zapisanie mojej historii po wyjściu z sesji? Używam ConEmu jako konsoli.

dźgnięcie
źródło

Odpowiedzi:

1

Oto alternatywne podejście, które utrwala twoją historię bez użycia innego skrótu PowerShell.

Zaczerpnięte z https://software.intel.com/en-us/blogs/2014/06/17/giving-powershell-a-persistent-history-of-commands

Otwórz PowerShell w trybie administratora i dowiedz się, którą wersję programu PowerShell posiadasz, uruchamiając następujące polecenie:

$PSVersionTable.PSVersion

Aby uruchomić tę wersję, potrzebujesz wersji wyższej niż 3. Jeśli masz starszą wersję, zaktualizuj ją.

Zezwól PowerShellowi na importowanie lub używanie skryptów, w tym modułów, przez uruchomienie następującego polecenia:

set-executionpolicy remotesigned

Zainstaluj PsGet i zainstaluj potrzebne moduły, wykonując następujące polecenia:

(new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1") | iex
import-module PsGet
install-module PsUrl
install-module PSReadline

Utwórz następujący skrypt

$HistoryFilePath = Join-Path ([Environment]::GetFolderPath('UserProfile')) .ps_history
Register-EngineEvent PowerShell.Exiting -Action { Get-History | Export-Clixml $HistoryFilePath } | out-null
if (Test-path $HistoryFilePath) { Import-Clixml $HistoryFilePath | Add-History }
# if you don't already have this configured...
Set-PSReadlineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadlineKeyHandler -Key DownArrow -Function HistorySearchForward

Zapisz plik jako C:\Users\<username>\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1, gdzie należy zastąpić poprawną nazwą folderu na komputerze. Nie zapomnij zmienić opcji „zapisz jako typ” dla wszystkich plików.

Zamknij PowerShell i otwórz go ponownie, aby zaczął używać zapisanego skryptu.

Od teraz,

get-history

Pobiera ostatnie kilkaset wpisanych poleceń i możesz je przewijać za pomocą klawiszy strzałek.

Geek Journeyman
źródło
1
Linki zewnętrzne mogą się zepsuć lub być niedostępne, w takim przypadku Twoja odpowiedź nie byłaby przydatna. Prosimy o podanie niezbędnych informacji w odpowiedzi i skorzystanie z linku do przypisania i dalszego czytania. Dzięki.
fixer1234
Nie mam czasu, ale pomyślałem, że to może komuś pomóc. Oznacziłem to jako wiki społeczności, więc idź.
Rory,
Następnie po prostu opublikuj linki jako komentarze. Nie pozostawiaj innym możliwości poprawy, jeśli nie masz czasu na zwrócenie na to uwagi.
Jamal
1
Sparafrazowane w miarę możliwości i zaktualizowane jako samodzielna odpowiedź. Zajęło mi to 5 minut przy śniadaniu. Byłoby miło, gdyby ludzie zarówno ustalili własne odpowiedzi, jak i pomogli tam, gdzie to możliwe, miałem kilka odpowiedzi, które zostały znacznie poprawione przez innych, i dlatego mamy prawa do edycji, nie?
Journeyman Geek
To faktycznie działało. Nie jestem pewien, do czego install-module PsUrlsłuży ten krok, nie udało się na moim komputerze, ale skrypt i tak działa. Używa PSReadline, ale wydaje się, że nie używa PsUrl
stib
4

Kolejny sposób, aby to zrobić, na wypadek, gdyby był pomocny dla każdego.

Powershell teraz automatycznie zapisuje historię poleceń w pliku „% userprofile% \ AppData \ Roaming \ Microsoft \ Windows \ PowerShell \ PSReadline \ ConsoleHost_history.txt”

Aby wyświetlić historię, dodałem funkcję do mojego profilu w taki sposób ...

function h2 {
    $h = [System.Environment]::ExpandEnvironmentVariables("%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt")
    cat $h;
}

Teraz mogę po prostu wpisać „h2”, aby wyświetlić pełną historię. Niezbyt sprytny, ale skuteczny.

użytkownik1751825
źródło
3

Nie jest to idealne, ale możesz użyć skrótu z poleceniem start, który mówi PowerShellowi, aby zapisał całą historię przy wyjściu.

  1. Kliknij pulpit prawym przyciskiem myszy i wybierz Nowy -> Skrót
  2. Wprowadź następujące informacje jako ścieżkę skrótu:
powershell -NoExit -Command $ histlog = Register-EngineEvent -SourceIdentifier ([System.Management.Automation.PsEngineEvent] :: Exiting) -Action {Get-History | Export-Clixml ~ \ PowerShell \ history.xml}
  1. Wybierz nazwę skrótu i ​​kliknij OK .

Jeśli uruchomisz z tego skrótu, twoja historia zostanie zapisana w ~ \ PowerShell \ history.xml za każdym razem, gdy PowerShell otrzyma zdarzenie wyjściowe.


źródło
Wspaniały! dzięki. Jeśli nie chcesz używać domyślnej konsoli PowerShell (powiedz, że chcesz użyć ConEmu), możesz dodać to do domyślnych zadań uruchamianych podczas uruchamiania nowej konsoli.
stib