2012-03-27 75 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/