ডিফল্টভাবে 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 কমান্ডলেট দিয়ে পুরো কমান্ড ইতিহাস লিস্ট করা যায়।
বর্তমান PowerShell সেশনে পূর্বে এক্সিকিউট করা কমান্ডের বিস্তারিত তথ্য (কমান্ড স্ট্যাটাস, স্টার্ট/এন্ড/ডিউরেশন টাইমসহ) দেখতে:
Get-History | Format-List -Property *

ডিফল্টভাবে Windows 10-এ PowerShell শেষ ৪০৯৬ টি কমান্ড সংরক্ষণ করে একটি প্লেইন টেক্সট ফাইলে যা প্রতিটি ইউজারের প্রোফাইলে থাকে: %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 Management Framework-এ বিল্ট-ইন নয়, বরং থার্ড-পার্টি 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 | Where-Object {$_.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 কমান্ডলেট দিয়ে কনফিগার করা যায়। বর্তমান PSReadline সেটিংস দেখতে:
Get-PSReadlineOption | select HistoryNoDuplicates, MaximumHistoryCount, HistorySearchCursorMovesToEnd, HistorySearchCaseSensitive, HistorySavePath, HistorySaveStyle

নিচের PSReadline প্যারামিটারগুলোর সেটিংস আমাদের জন্য গুরুত্বপূর্ণ হতে পারে:
- HistoryNoDuplicates – একই কমান্ডগুলো সংরক্ষণ হবে কিনা নির্ধারণ করে;
- MaximumHistoryCount – সংরক্ষিত কমান্ডের সর্বোচ্চ সংখ্যা (ডিফল্টভাবে শেষ ৪০৯৬ কমান্ড সংরক্ষিত হয়);
- HistorySearchCursorMovesToEnd — সার্চ করার সময় কমান্ডের শেষে যেতে হবে কিনা নির্ধারণ করে;
- HistorySearchCaseSensitive – সার্চ কেস-সেনসিটিভ কিনা (ডিফল্টভাবে PS কমান্ড ইতিহাস কেস-সেনসিটিভ নয়);
- HistorySavePath – কমান্ড সংরক্ষিত হয় সেই ফাইলের পথ দেখায়;
- HistorySaveStyle – কমান্ড সংরক্ষণের đặc異তা নির্ধারণ করে:
- SaveIncrementally — কমান্ড রান হওয়ার পর সংরক্ষিত হয় (ডিফল্ট);
- SaveAtExit — PowerShell কনসোল বন্ধ হলে ইতিহাস সংরক্ষিত হয়;
- SaveNothing — কমান্ড ইতিহাস সংরক্ষণ ডিজেবল করে।
Set-PSReadlineOption ব্যবহার করে PSReadLine মডিউলের সেটিংস পরিবর্তন করা যায়। উদাহরণস্বরূপ:
Set-PSReadlineOption -HistorySaveStyle SaveAtExit

PowerShell কমান্ড লগ ফাইলে সংরক্ষিত হওয়ার সংখ্যা বাড়াতে:
Set-PSReadlineOption -MaximumHistoryCount 10000
তবে, এক্সিকিউট করা PowerShell কমান্ডের ইতিহাস সংরক্ষণ করার ক্ষমতা cmd-এর চেয়ে PoSh কনসোলকে পছন্দ করার একটি কারণ।
PowerShell কনসোল হিস্ট্রি কমান্ড কীভাবে ক্লিয়ার করবেন?
উপরে ব্যাখ্যা করা হয়েছে, PSReadline মডিউল সব PowerShell কনসোল কমান্ড একটি টেক্সট ফাইলে সংরক্ষণ করে। তবে কিছু কেসে অ্যাডমিনিস্ট্রেটরকে PowerShell কনসোলে বিভিন্ন সেনসিটিভ ইনফরমেশন (ক্রেডেনশিয়াল, পাসওয়ার্ড, ঠিকানা, পারসোনাল ডেটা ইত্যাদি) দিতে হয়। তাই অন্য সার্ভার অ্যাডমিন বা আক্রমণকারী প্লেইন টেক্সট ফাইল থেকে হিস্ট্রি ডেটা অ্যাক্সেস করতে পারে। সিকিউরিটি কারণে, এক্সিকিউট করা PowerShell কমান্ডের ইতিহাস ক্লিয়ার করা বা কমান্ড ইতিহাস সম্পূর্ণ ডিজেবল করা দরকার হতে পারে।
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 কমান্ডলেট ব্যবহার করুন:
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 }