如何从获取位置输出中删除部分路径



我正在尝试为 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 强制转换(因为它使用"/"作为路径分隔符),但没有理由不使用字符串方法进行正常操作。

最新更新