2012-03-27 79 views
9

在PowerShell中,您可以使用pushdPush-Location的別名)和popdPop-Location的別名)將項目推送到位置堆棧上並將其彈出項目。如何使用第四種交換操作來操作PowerShell的位置堆棧?

這與bash的pushdpopd功能非常類似,用於一堆目錄。

但bash的另一個不錯的特性是,你可以使用pushd本身來交換堆棧中的前兩個位置。所以你可以在一個位置和另一個位置之間快速來回翻轉。而且它也需要像pushd +3這樣的參數,因此您可以使用堆棧中幾個元素的位置進行交換。

有沒有辦法用PowerShell做到這一點?

舉個例子,在bash:

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

回答

5

目前已建成的PowerShell Community Extensions類似的功能多年:-)例如:

 
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複製到文件文件(僅適用於該文件所在的目錄),例如:

cd $profile 

爲了使在PSCX此功能,您必須在導入模塊如指定Pscx.UserPreference.ps1文件:

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

在這種情況下,我複製從文件PSCX目錄到我家的目錄並修改以適合我的口味。欲瞭解更多信息請執行:

cd -? 

man cd -full 

的完整源出於此嵌套模塊here (on CodePlex)

+0

這是一個相當不錯的功能:-)希望這是內置的!我傾向於使用env變量和製表符完成導航,但這就像在你的shell上有後退和前進按鈕:-) – 2012-03-28 05:02:13

+0

這看起來很有趣,在某些方面比bash的'push + n'命令提供的swapn功能更好。 – Omnifarious 2012-03-28 22:18:37

8

您可以用-Stack開關訪問使用Get-Location你的籌碼。作爲一個堆棧的本質,它是LIFO。 Get-Location -Stack創建System.Management.Automation.PathInfoStack對象,以便您可以訪問各個堆項目是這樣的:

  • $stack.ToArray()[-1]:獲取第一推項目。
  • $stack.ToArray()[0]:獲取上次推送的項目。與$stack.Peek()相同。

所以,答案是沒有內置開關Push-Location來修改您的堆棧順序,但您可以創建一個函數來做到這一點。請注意,這操縱了默認堆棧。顧名思義,您可以使用Push-Location -StackName MyStack創建自己的堆棧。您甚至可以使用Set-Location -StackName MyStack將默認堆棧更改爲您的自定義堆棧。

我沒有找到一種方法來設置堆棧對象,但不使用Pop/Push cmdlet。所以我不得不以一種比我可以...更難的方式來實現它......但是這裏有一個小函數允許你交換堆棧的前兩個路徑。

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 

輸出:

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

現掉換頂部兩條路徑:

Swap-StackTop 
Get-Location -Stack 

輸出:

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

那裏的小功能;你應該把它提供給pscx.codeplex.com – x0n 2012-03-28 02:20:19

+0

這是一個有趣的黑客。擴展到一般化的swapn並不難。 – Omnifarious 2012-03-28 22:17:45

0

感謝,Keith Hill,爲CD.psm1模塊!

我採用了基本的堆棧代碼,並使用更類似PowerShell的語法來實現它。我也修改了一下,以便在堆棧中間改變位置時保留堆棧條目。對於任何有興趣的人來說,它都可以在PowerShell庫中找到:

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