डिफ़ॉल्ट रूप से 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 सत्र के कमांड इतिहास को स्क्रॉल कर सकते हैं या Get-History cmdlet का उपयोग करके संपूर्ण कमांड इतिहास सूचीबद्ध कर सकते हैं।
आप वर्तमान PowerShell सत्र में पहले निष्पादित कमांड के बारे में अधिक विस्तृत जानकारी प्रदर्शित कर सकते हैं, जिसमें कमांड स्टेटस और शुरू/समाप्ति/अवधि समय शामिल है:
Get-History | Format-List -Property *

डिफ़ॉल्ट रूप से, Windows 10 में PowerShell प्रत्येक उपयोगकर्ता की प्रोफ़ाइल में स्थित एक प्लेन टेक्स्ट फ़ाइल में अंतिम 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 (रिवर्स खोज) और CTRL+S (फॉरवर्ड खोज) का उपयोग करके कमांड हिस्ट्री खोज सकते हैं। कुंजी संयोजन दबाएं और उस कमांड का हिस्सा टाइप करना शुरू करें जिसे आप पहले निष्पादित कमांड में ढूंढना चाहते हैं। आपके द्वारा दर्ज टेक्स्ट पहले निष्पादित कमांड में किसी भी स्थिति में मिल जाएगा (PowerShell में F8 या Shift+F8 का उपयोग करके खोज के विपरीत, जो केवल लाइन की शुरुआत से मिलान खोजने की अनुमति देता है)। PowerShell कंसोल को खोज स्ट्रिंग से मेल खाने वाली पिछली कमांड प्रदर्शित करनी चाहिए। लाइन मिलान कमांड में हाइलाइट किए जाते हैं।
यदि मिली कमांड आपको सूट नहीं करती है, तो हिस्ट्री के माध्यम से खोज जारी रखने के लिए, CTRL+R/CTRL+S फिर से दबाएं। परिणामस्वरूप, खोज पैटर्न से मेल खाने वाली अगली कमांड स्क्रीन पर दिखाई देगी।

F8 कुंजी का उपयोग करके, आप हिस्ट्री में उस कमांड को ढूंढ सकते हैं जो वर्तमान कमांड लाइन पर टेक्स्ट से मेल खाती है। उदाहरण के लिए, get- दर्ज करें और F8 दबाएं। कमांड हिस्ट्री में इस टेक्स्ट से मेल खाने वाली अंतिम एंट्री मिल जाएगी। हिस्ट्री में अगली कमांड पर जाने के लिए, F8 फिर से दबाएं।

आप कमांड हिस्ट्री के माध्यम से खोजने के लिए # कैरेक्टर का भी उपयोग कर सकते हैं। उदाहरण के लिए, Get-WMI से शुरू होने वाली अंतिम कमांड ढूंढने के लिए, #get-wmi टाइप करें और Tab कुंजी दबाएं। पैटर्न से मेल खाने वाली अंतिम कमांड कंसोल में दिखाई देगी:

कमांड हिस्ट्री क्लासिक Windows PowerShell और नए PowerShell Core दोनों में समान रूप से काम करती है (यदि आपने पहले ही अपना PoSh संस्करण अपग्रेड कर लिया है)।
Notepad.exe विंडो में पिछले PoSh कमांड की सूची प्राप्त करने के लिए, कमांड चलाएं:
notepad (Get-PSReadLineOption | select -ExpandProperty HistorySavePath)

क्वेरी से मेल खाने वाले हिस्ट्री में कमांड की सूची प्रदर्शित करने के लिए, आप उपयोग कर सकते हैं:
Get-History | Select-String -Pattern "Get-"

PSReadLine मॉड्यूल के साथ PowerShell कमांड हिस्ट्री प्रबंधित करना
PowerShell 5.0 में कमांड हिस्ट्री कार्यक्षमता Windows मैनेजमेंट फ्रेमवर्क में अंतर्निहित नहीं है, बल्कि थर्ड-पार्टी PSReadLine मॉड्यूल पर आधारित है, जो PowerShell कंसोल की कार्यक्षमता को काफी बढ़ाता है। PSReadLine कंसोल में सिंटैक्स हाइलाइट करता है, यह आपके माउस से टेक्स्ट चयन और CTRL+C और CTRL+V का उपयोग करके कॉपी/पेस्ट के लिए जिम्मेदार है। Windows 10 में यह मॉड्यूल C:\Program Files\WindowsPowerShell\Modules\PSReadline फ़ोल्डर में स्थित है और PowerShell कंसोल शुरू होने पर स्वचालित रूप से इंपोर्ट होता है।
PSReadLine स्टैंडअलोन PowerShell 5.0 (या कभी नहीं) इंस्टॉलर में पिछले Windows संस्करणों के लिए शामिल नहीं है। इस प्रकार, यदि आप पिछले Windows संस्करणों (Windows 7/8.1 और Windows Server 2008R2/2012R2) में PowerShell कमांड हिस्ट्री कार्यक्षमता का उपयोग करना चाहते हैं, तो Windows Management Framework 5.1 इंस्टॉल करने के अलावा, आपको PackageManagement मॉड्यूल (पूर्व में OneGet) के माध्यम से ऑनलाइन रिपॉजिटरी से PSReadLine मॉड्यूल इंस्टॉल करना होगा:
Install-Module PSReadLine
PSReadLine मॉड्यूल के कमांड हिस्ट्री प्रबंधन के कार्यों की पूरी सूची और उन्हें असाइन की गई कुंजियों को इस कमांड के साथ प्रदर्शित किया जा सकता है:
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

कमांड हिस्ट्री को Get-PSReadlineOption और Set-PSReadlineOption cmdlets का उपयोग करके कॉन्फ़िगर किया जा सकता है। वर्तमान PSReadline सेटिंग्स को इस कमांड के साथ देखा जा सकता है:
Get-PSReadlineOption | select HistoryNoDuplicates, MaximumHistoryCount, HistorySearchCursorMovesToEnd, HistorySearchCaseSensitive, HistorySavePath, HistorySaveStyle

निम्न PSReadline पैरामीटर्स की सेटिंग्स हमारे लिए महत्वपूर्ण हो सकती हैं:
- HistoryNoDuplicates – निर्धारित करता है कि क्या समान कमांड को सहेजा जाना चाहिए;
- MaximumHistoryCount – संग्रहीत कमांड की अधिकतम संख्या (डिफ़ॉल्ट रूप से अंतिम 4096 कमांड सहेजी जाती हैं);
- HistorySearchCursorMovesToEnd — निर्धारित करता है कि खोज करते समय आपको कमांड के अंत में जाना है या नहीं;
- HistorySearchCaseSensitive – निर्धारित करता है कि खोज केस-सेंसिटिव है या नहीं (PS कमांड हिस्ट्री डिफ़ॉल्ट रूप से केस-सेंसिटिव नहीं है);
- HistorySavePath – वह पथ दिखाता है जहां कमांड संग्रहीत की जाती है;
- HistorySaveStyle – कमांड सहेजने की विशेषताओं को निर्धारित करता है:
- SaveIncrementally — कमांड चलने के बाद सहेजी जाती हैं (डिफ़ॉल्ट);
- SaveAtExit — PowerShell कंसोल बंद होने पर हिस्ट्री सहेजी जाती है;
- SaveNothing — कमांड हिस्ट्री सहेजना अक्षम करें।
आप Set-PSReadlineOption का उपयोग करके PSReadLine मॉड्यूल की सेटिंग्स बदल सकते हैं। उदाहरण के लिए:
Set-PSReadlineOption -HistorySaveStyle SaveAtExit

लॉग फ़ाइल में सहेजी गई PowerShell कमांड की संख्या बढ़ाने के लिए, कमांड चलाएं:
Set-PSReadlineOption -MaximumHistoryCount 10000
तो, निष्पादित PowerShell कमांड के इतिहास को सहेजने की क्षमता PoSh कंसोल को cmd पर प्राथमिकता देने के तर्कों में से एक है।
PowerShell कंसोल हिस्ट्री कमांड कैसे क्लियर करें?
जैसा कि हमने ऊपर बताया, PSReadline मॉड्यूल सभी PowerShell कंसोल कमांड को एक टेक्स्ट फ़ाइल में सहेजता है। हालांकि, कुछ मामलों में, प्रशासक को PowerShell कंसोल में विभिन्न संवेदनशील जानकारी दर्ज करनी पड़ती है (क्रेडेंशियल, पासवर्ड, पते, व्यक्तिगत डेटा, आदि)। इस प्रकार, एक अन्य सर्वर प्रशासक या हमलावर प्लेन टेक्स्ट फ़ाइल में हिस्ट्री डेटा तक पहुंच सकता है। सुरक्षा कारणों से, आपको निष्पादित PowerShell कमांड के इतिहास को क्लियर करने या कमांड हिस्ट्री को पूरी तरह से अक्षम करने की आवश्यकता हो सकती है।
Clear-History 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 कमांड हिस्ट्री को दूसरे सत्र में एक्सपोर्ट/इंपोर्ट कैसे करें?
कभी-कभी अलग-अलग कंप्यूटरों पर अक्सर उपयोग की जाने वाली 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 सत्र के अंत में पिछली कमांड को स्वचालित रूप से फ़ाइल में एक्सपोर्ट करने के लिए, आप स्क्रिप्ट को 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 }