我想写一个PowerShell的自定义提示,我想知道如何筛选出Get-Location
的输出中的1 ... n目录。如何从Get-Location输出中删除部分路径?
function prompt {
"PS " + $(get-location) + "> "
}
所以,如果路径太长,我想省略一些目录,只是显示PS...blah\blah>
什么的。我试过(get-container) - 1
但它不起作用。
我想写一个PowerShell的自定义提示,我想知道如何筛选出Get-Location
的输出中的1 ... n目录。如何从Get-Location输出中删除部分路径?
function prompt {
"PS " + $(get-location) + "> "
}
所以,如果路径太长,我想省略一些目录,只是显示PS...blah\blah>
什么的。我试过(get-container) - 1
但它不起作用。
Ansgar Wiechers' answer会给你最后一个目录,但如果你想办法在的做底多个目录文件路径(使用三联点表示),你可以cast the directory path到URI,然后就拿到并加入segments:
function prompt {
$curPath = pwd
$pathUri = ([uri] $curPath.ToString())
if ($pathUri.Segments.Count -le 3) {
"PS {0}>" -f $curPath
} else {
"PS...{0}\{1}>" -f $pathUri.Segments[-2..-1].trim("/") -join ""
}
}
或者只使用一个字符串(无URI投)
function prompt {
$curPath = pwd
$pathString = $curPath.Tostring().split('\') #Changed; no reason for escaping
if ($pathString.Count -le 3) {
"PS {0}>" -f $curPath
} else {
"PS...{0}\{1}>" -f $pathString[-2..-1] -join ""
}
}
$a = prompt
Write-Host $a
然后,只需改变-2,无论你想成为第一个目录和-le 3相匹配。当我必须通过浏览器或通过与Linux机器的连接运行东西(因为它使用“/”作为路径分隔符)时,我通常使用uri转换,但没有理由不对正常操作使用字符串方法。
总是忘记URI转换 – Matt
@Matt谢谢,看到了,但添加了一个字符串方法,所以没有得到编辑:) – JGreenwell
我可能是错的,但是你的“字符串”代码有缺陷,因为你使用的是字符串方法分裂。它不支持正则表达式,你匹配_two_斜杠 – Matt
使用Split-Path
与-Leaf
参数,如果你想只是一个路径的最后一个元素:
function prompt {
"PS {0}> " -f (Split-Path -Leaf (Get-Location))
}
我想做一个更动态的功能。我只做了基本的字符串操作。你可以做一些逻辑嵌套Split-Path
,但字符串操作方法只是非常简洁。既然你想要返回的东西不会是一个完全验证的路径,我觉得更好的解决方案。
Function Get-PartialPath($path, $depth){
If(Test-Path $path){
"PS {0}>" -f (($path -split "\\")[-$depth..-1] -join "\")
} else {
Write-Warning "$path is not a valid path"
}
}
样本函数调用
Get-PartialPath C:\temp\folder1\sfg 2
PS folder1\sfg>
所以你可以使用这个简单的功能。 Pass是路径的字符串。假设它是有效的,那么它将根据需要划分出尽可能多的尾部块。我们使用-join
来重建它。如果您给$depth
的号码太高,则会返回整个路径。所以如果你只想要显示3个文件夹,将$depth
设置为3.
你是否想过只显示最后的x个目录?拆分路径是一个简单的方法去! – Matt