2012-03-27 3 views
9

PowerShellでは、(Push-Locationのエイリアス)とpopd(エイリアスはPop-Location)を使用して、場所スタックに項目をプッシュしてアイテムをポップすることができます。PowerShellの場所スタックを、同じようなスワップ操作で操作するにはどうすればよいですか?

これは、ディレクトリのスタックのbashのpushdpopdの機能に非常によく似ています。

しかし、bashの他の優れた機能の1つは、pushdを単独で使用してスタックの上の2つの場所を入れ替えることができる点です。だから、ある場所と別の場所との間で非常に素早く行き来することができます。また、pushd +3のような引数を取るので、スタック内のいくつかの要素をスワップすることができます。

PowerShellでこれを行う方法はありますか? bashの例として

、:

$ pwd 
/bin 
$ pushd ~ 
~ /bin 
$ pwd 
/home/hopper 
$ pushd 
/bin ~ 
$ pwd 
/bin 
$ pushd 
~ /bin 
$ pwd 
/home/hopper 

答えて

5

Swap-StackTop 
Get-Location -Stack 

が出力:

Path 
---- 
C:\Program Files 
C:\Users 
C:\ 

今すぐ上の2つの経路を入れ替えます:-)例:

 
48 > cd C:\inetpub 
C:\inetpub 
49 > cd C:\Windows\System32 
C:\Windows\System32 
50 > cd - 
C:\inetpub 
51 > cd + 
C:\Windows\System32 
52 > cd 

    # Directory Stack: 
    --- ---------------- 
    0 C:\Users\Keith 
    1 C:\inetpub 
-> 2 C:\Windows\System32 

53 > cd -0 
C:\Users\Keith 

これはかなりスワップではありませんが、逆方向( - )と前向き(+)のメタファーは、今日かなり確立されています。 -<num>を指定して、ロケーション履歴の任意の場所にスキップします。実際には、これはPSCXユーザーによって提案された非常に便利な追加物でした。あなたはファイルをCDにすることができます。:あなたは、モジュールなどをインポートするときPscx.UserPreference.ps1ファイルを指定する必要がPSCXでこの機能を有効にするために

cd $profile 

:この場合

Import-Module PSCX -arg ~\Pscx.UserPreferences.ps1 

を、私はからファイルをコピー私の家にPSCX dirと私の好みに合わせて修正する。詳細情報については、実行:

cd -? 

または

man cd -full 

このネストされたモジュールの完全なソースはhere (on CodePlex)です。

+0

それはかなり良い機能です:-)願いが組み込まれています!私はenv変数とタブ補完を使ってナビゲートする傾向がありますが、これはあなたのシェルに前後のボタンを持っているようなものです:-) –

+0

これは面白そうで、何らかの点ではbashの 'push + n'コマンドによって提供されるswapn機能より、 – Omnifarious

8

あなたは-StackスイッチでGet-Locationを使用してスタックにアクセスすることができます。スタックの性質として、LIFOです。

  • $stack.ToArray()[-1]:最初のプッシュアイテムを取得し、あなたがこのような個々のスタック項目にアクセスできるようにGet-Location -StackSystem.Management.Automation.PathInfoStackオブジェクトを作成します。
  • $stack.ToArray()[0]:最後にプッシュされた項目を取得します。 $stack.Peek()と同じです。

答えは、Push-Locationのスイッチが組み込まれていないため、スタックの順序を変更できますが、これを行う関数を作成できます。これは、デフォルトスタックを操作することに注意してください。名前が示すように、Push-Location -StackName MyStackを使用して独自のスタックを作成することができます。 Set-Location -StackName MyStackを使用して、デフォルトのスタックをカスタムスタックに変更することもできます。

Pop/Pushコマンドレットを使用せずにスタックオブジェクトを設定する方法が見つかりませんでした。だから私はこれよりも困難な方法でこれを実装しなければなりませんでしたが、ここではスタックの上位2つのパスを入れ替えることができる小さな関数があります。

function Swap-StackTop { 
    param ($StackName = "default") 
    $origPath = $PWD 
    $stack = Get-Location -StackName $StackName 
    $stackArray = $stack.ToArray() 
    $last = $stackArray[0] 
    $beforeLast = $stackArray[1] 
    $stackArray[0] = $beforeLast 
    $stackArray[1] = $last 
    $stackArray | % {Pop-Location} 
    Set-Location -Path $stackArray[-1].Path 
    $stackArray[($stackArray.Count-2)..0] | % { 
     Push-Location $_.Path 
    } 
    Push-Location -Path $origPath.Path 
} 

cd C:\ 
Push-Location 'C:\Users' 
Push-Location 'C:\Program Files' 
Push-Location C:\Windows 
Get-Location -Stack 

出力:年間のPowerShell Community Extensionsに組み込まれている同様の機能がありました

Path 
---- 
C:\Users 
C:\Program Files 
C:\ 
+0

がちょっといい機能。あなたはそれをpscx.codeplex.com – x0n

+0

に寄付すべきです。これは面白いハックです。一般化されたスワップに拡張するのは難しくありません。 – Omnifarious

0

ありがとう、Keith HillCD.psm1モジュールの場合!

私は基本的なスタックコードをとり、よりPowerShellのような構文で実装しました。また、スタックの途中で場所を変更するときにスタックエントリを順方向に保持するように少し修正しました。興味を持っている人にとって、それは、PowerShellのギャラリーで利用可能です:

https://www.powershellgallery.com/packages/LocationHistory/

関連する問題