如何通过类似第四次交换操作来操纵PowerShell的位置堆栈?

时间:2012-03-27 23:03:17

标签: windows powershell

在PowerShell中,您可以使用pushdPush-Location的别名)和popdPop-Location的别名)将项目推送到某个位置并从中弹出项目叠加。

这与bash的一堆目录的pushdpopd功能非常相似。

但bash的另一个不错的功能是你可以单独使用pushd来交换堆栈中的前两个位置。因此,您可以在一个位置和另一个位置之间快速来回切换。它还需要pushd +3之类的参数,因此您可以在堆栈中交换一些元素。

有没有办法用PowerShell做到这一点?

例如,在bash中:

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

3 个答案:

答案 0 :(得分:8)

您可以使用Get-Location开关使用-Stack来访问您的筹码。作为堆栈的性质,它是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:\

答案 1 :(得分: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到一个文件文件(只是cds到文件所在的目录),例如:

cd $profile

为了在PSCX中启用此功能,您必须在导入模块时指定Pscx.UserPreference.ps1文件,例如:

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

在这种情况下,我将文件从PSCX目录复制到我的家庭目录并根据我的喜好进行修改。有关更多信息,请执行:

cd -?

man cd -full

此嵌套模块的完整源代码为here (on CodePlex)

答案 2 :(得分:0)

感谢Keith HillCD.psm1模块!

我使用了基本的堆栈代码,并使用类似PowerShell的语法实现了它。我还修改了一下,以便在堆栈中间更改位置时保持前向堆栈条目。对于任何有兴趣的人,它都可以在PowerShell库中找到:

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