web-dev-qa-db-ja.com

PowerShell:履歴の機能強化(readline)?

私がBashで好きで、PowerShellで行う方法を知りたいと思うことのいくつか:

  1. Bashでは、現在の行と同じプレフィックスで始まるコマンドのみをスクロールするように履歴スクロールを設定しています。最新のコミットを確認したい場合(コメントの一部を再利用する場合など)、「git」と記述してから 

  2. 関連するのはもちろん履歴検索です CtrlR

  3. 他のものを見つけるために、私は書きます:

    h | grep foo
    

    PowerShellで使用するもの:

    h -c 1000 | where {$_.commandline.contains("foo")}
    

    (明らかに私は初心者です、もっと短い方法があるに違いありません)

  4. のようなもの:

    mv file.txt{,.bak}
    

    または

    mv file.txt !#$.bak
    
  5. 魔法の空間(!$をインラインで拡張します)

PowerShellの代替手段は何ですか?

12
IttayD

(3)の場合、プロファイルに関数として記述できます(例:%USERPROFILE%\My Documents\WindowsPowerShell\profile.ps1):

function hh ([string] $Word) {
    Get-History -c 1000 | where {$_.commandline.contains($Word)}
}

次に:

hh foo

ただし、Powershellは、対話型シェルとしてよりもスクリプト言語として考えるのが最適です。これは、基盤となるコンソールがまだcmd.exeであり、すべての制限があるためです。

つまり、インタラクティブ履歴の場合はF7、前のコマンドをコピーする場合はF3、単一の文字をコピーする場合はF1、特定の文字まで前のコマンドをコピーする場合はF2などです。

2
njd

1-あなたは使用することができます F8 Windowsコンソールから、現在の行の先頭に一致するコマンドを循環します。これは大文字と小文字を区別する一致です。

2-#を使用して、前のコマンドと一致させることができます。 #<partial match><tab>の使用では大文字と小文字が区別されず、前のコマンドの任意の位置のテキストと一致します。

次のコマンド履歴がある場合:

# 1
$np = Start-Process notepad -PassThru
# 2
$np| get-process
# 3
$np| Stop-Process

#prと入力してから tab 1、2、3を繰り返し循環します。

#stと入力してから tab 1と3を繰り返し循環します。

#のみを使用すると、すべての履歴に一致します。

#は、コマンドの一部を入力した後にも使用できます。あなたの歴史が:

'notepad'
select *

Get-Process #n<tab>| #s<tab>と入力して、Get-Process 'notepad'| select *を取得できます。

3-Select-Stringを使用できます。使いやすくするためにエイリアスを作成します(PowerShellv3はエイリアスslsを追加しました)。その後、あなたはすることができます。

h| sls foo

4-次のようなことができます。

gci *a.txt| ren -n {$_.Name + '.bak'}

5-$$は最後のコマンドの最後のトークンと一致しますが、インラインで展開する方法がわかりません。

15
Rynant

Oisin GrehanのPSReadlineモジュールを確認する必要があります: http://nivot.org/blog/post/2012/09/12/Emulating-Bash-GNU-Readline-with-PowerShell-

コードはここから入手できます: https://bitbucket.org/oising/psreadline/overview

これにより、行編集や履歴検索などの基本的なEMACSバインディングを追加することで、Windowsをときどき使用する経験豊富な* nix管理者の観点から、PowerShellを実際にCLIとして使用できるようになります。

2
Joe Carroll