在PowerShell中,您可以使用pushd
(Push-Location
的别名)和popd
(Pop-Location
的别名)将项目推送到某个位置并从中弹出项目叠加。
这与bash的一堆目录的pushd
和popd
功能非常相似。
但bash的另一个不错的功能是你可以单独使用pushd
来交换堆栈中的前两个位置。因此,您可以在一个位置和另一个位置之间快速来回切换。它还需要pushd +3
之类的参数,因此您可以在堆栈中交换一些元素。
有没有办法用PowerShell做到这一点?
例如,在bash中:
$ pwd
/bin
$ pushd ~
~ /bin
$ pwd
/home/hopper
$ pushd
/bin ~
$ pwd
/bin
$ pushd
~ /bin
$ pwd
/home/hopper
答案 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 Hill,CD.psm1
模块!
我使用了基本的堆栈代码,并使用类似PowerShell的语法实现了它。我还修改了一下,以便在堆栈中间更改位置时保持前向堆栈条目。对于任何有兴趣的人,它都可以在PowerShell库中找到: