我正在尝试为 PowerShell 编写自定义提示,我想知道如何过滤掉 Get-Location
输出中的 1...n 目录。
function prompt {
"PS " + $(get-location) + "> "
}
因此,如果路径太长,我想省略一些目录,只显示PS...blahblah>
或其他内容。我试过(get-container) - 1
但它不起作用。
如果您只需要路径的最后一个元素,请将 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:tempfolder1sfg 2
PS folder1sfg>
所以你可以使用这个简单的功能。传递是路径的字符串。假设它是有效的,那么它会将路径分割成任意数量的尾随块。我们使用-join
来重建它。如果给出的$depth
数字过高,则将返回整个路径。因此,如果您只想显示 3 个文件夹,请将$depth
设置为 3。
Ansgar Wiechers的回答会给你最后一个目录,但如果你想要一种方法在文件路径的末尾做多个目录(使用三点表示法),你可以将目录路径转换为一个URI,然后获取并加入段:
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 强制转换(因为它使用"/"作为路径分隔符),但没有理由不使用字符串方法进行正常操作。