読者です 読者をやめる 読者になる 読者になる

tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

PowerShell コンソールにおける入力履歴管理について

shell といえば、コンソールです。

PowerShell にも powershell.exe というコンソールがあります。 Linux/Unix を使ってて感じるのは、コンソールの豊富なオプションによる使いやすさです。 これこそ、さすがCUI を中心に据えるだけのことがあると常々感じます。

Windows における CUI = PowerShell というからにはもう少しこの辺は強くなってくれると嬉しいものです。

ちょっと便利に使うために、今回は、PowerShell コンソールユーザー向けに 履歴呼び出しについてです。

一応これだけあるんですけど、好きな動作があればいいですね。

  1. キーコードバインドでの呼び出し
  2. 画面にだしたい
  3. Get-History
  4. ヒストリのタブ補完

 

履歴とは

ようは、コンソールで入力した過去の内容をさします。 例えば次のような入力があったとして

PS C:\Users\acquire>ls
PS C:\Users\acquire>ps
PS C:\Users\acquire>ps -name powershell
PS C:\Users\acquire>Get-Command

これらの入力履歴を呼び出すことを差します。

キーコードバインドでの呼び出し

といっても標準のです。 キーボードの ↑ / ↓ キーで履歴を遡ったり先に進めたりできます。 例えば、このような入力が終わったとして

PS C:\Users\acquire>ls
PS C:\Users\acquire>ps
PS C:\Users\acquire>ps -name powershell
PS C:\Users\acquire>Get-Command

次の入力待ちの状況で

PS C:\Users\acquire>

キーボードの ↑ を入力すると一つ前の結果が表示されます。 後は、↑ / 下で自由にどうぞ。

PS C:\Users\acquire>Get-Command

Linux / Unix の動作と少し違うのが、履歴を移動して実行後も、戻った先で履歴の位置が保持され、入力した内容は履歴の最後に追加されます。

つまり、先の例で上を3回押して

PS C:\Users\acquire>ps

で実行して、最後↑を押すと、

PS C:\Users\acquire>ls

となります。 Unix/Linux (bashなど) では、履歴を移動して実行後は履歴の最後に位置が戻りされ、入力した内容は履歴の最後に追加されます。

つまり、先の例で上を3回押して

[ec2-user@hoge ~]$ps

で実行して、最後↑を押すと、

[ec2-user@hoge ~]$ps

と、履歴で呼び出した最後のコマンドになります。 どっちがいいかは馴れでしょうが、正直 PowerShellの位置保持は余り馴れれませんね....

画面にだしたい

簡単な方法があります。 F7を押すのです。 画面に履歴一覧が表示されます。後は選んでください。 F7ならこうなります。

↑ / ↓ で実行したいコマンドを選んで Enterするだけです。 ちなみに、F8なら↑と同様に履歴をさかのぼります。

Get-History

コマンドレットで履歴一覧も取得できます。

Get-History

エイリアスはこれです。

history

取得結果です。

PS C:\Users\acquire> get-history

  Id CommandLine
  -- -----------
   1 ls
   2 ps
   3 ps -name powershell
   4 Get-Command

id指定でその番号のコマンドが何だったかも表示可能です。

Get-History -id 1

例では、こうですね。

PS C:\Users\acquire> Get-History -id 1

  Id CommandLine
  -- -----------
   1 ls

また、このコマンド結果をすぐに実行も可能です。 それには、例によって、 &(アンーパサダント) か . (ドットソース) をつけて実行します。

&(Get-History -id 1)

これで、例では、id = 1 に該当した lsが実行されます。 指定した件数分だけHistoryを取得する場合は、 -Countを利用します。 例えばこれで、過去2回の履歴が取得可能です。

Get-History -Count 2

こんな感じですね。

PS C:\Users\acquire> Get-History -Count 2

  Id CommandLine
  -- -----------
   3 ps -name powershell
   4 Get-Command

ヒストリのタブ補完

タブ補完で、過去の入力で現在の入力から始まるものがないかを探すこともできます。 それには、 #探したい入力 とします。 例えば、 Getから始まるコマンド履歴の補完には

#get

まで入力して Tabを入力するだけです。 すると例では次のようになります。

PS C:\Users\acquire> &(Get-History -id 1)

あとはTabを押すごとに過去に進んでいきます。 Shift+Tab で先に進めることもでき、最後で止まったりはせず、最後までいったら自動的に最新の履歴にぐるぐる巡ります。 あるいは、履歴のidも同様にできます。 例えば、例における1番目の履歴である ls をすぐに呼ぶなら #に数字を付けるだけです。 

#1

(つまり #1)まで入力して Tabを入力するだけです。 すると、このようになります。

PS C:\Users\acquire> ls

終わりに

PowerShell セッションを抜けると履歴が消えるのは.... RunSpaceだから.... (( 辛いですね、もう少し、Linux ライクな動きを見習うともっとよくなると思います。