コマンドバッファスタックで掲載した Set-CommandBufferStack.ps1 ですが、コマンドラインに引用符が含まれる場合に期待した動作にならないことがわかりました。修正して再掲載します。
ダウンロード
以下のスクリプトは修正済みです。
問題点
修正前のスクリプトは、次のように動作します。
キーボードから以下のように入力します。
PS> "abc"#
TAB を押してスタックにプッシュ
PS> "abc"
ESC を押してクリアし、 # を入力
PS> #
TAB を押してスタックからポップ
PS> "abc
このように、最後のダブルクォートが外れてしまいます。PowerShell の仕様で、わざわざ最後のダブルクォートを外す仕組みになっているのです。これは、最後にダブルクォートを追加して値を返すことですぐに修正できるのですが、シングルクォートの場合はもっと複雑です。
PS> 'abc' 'def'#
TAB を押してスタックにプッシュ
PS> ‘abc’ ‘def’
ESC を押してクリアし、 # を入力
PS> #
TAB を押してスタックからポップ
PS> ”abc” ”def
最後の引用符が外れてしまうのはダブルクォートと同じですが、それに加えてすべてのシングルクォートが二重になってしまいます。これはタブ補完を使っている限り修正できません。
修正後の動作
仕方がないので、シングルクォートが含まれている場合に限り、もう 1 ステップ加えることにしました。新しいスクリプトでは、次のように動作します。
PS> 'abc' 'def'#
TAB を押してスタックにプッシュ
PS> ‘abc’ ‘def’
ESC を押してクリアし、 # を入力
PS> #
TAB を押すと、次のようなコマンドが出てくるので
PS> Get-CommandBufferStack
Enter を押してポップ
PS> ‘abc’ ‘def’
タメになりました。
ありがとうございます。