如何从Get-Location输出中删除部分路径?

时间:2015-06-20 20:35:54

标签: windows powershell

我试图为PowerShell编写自定义提示,我想知道如何过滤掉Get-Location输出中的1 ... n目录。

function prompt {
  "PS " + $(get-location) + "> "
}

所以,如果路径太长,我想省略一些目录,只显示PS...blah\blah>或其他东西。我试过了(get-container) - 1,但它没有用。

3 个答案:

答案 0 :(得分:3)

如果您只想要路径的最后一个元素,请将Split-Path-Leaf参数一起使用:

function prompt {
  "PS {0}> " -f (Split-Path -Leaf (Get-Location))
}

答案 1 :(得分:2)

我想制作一个更具活力的功能。我只做基本的字符串操作。你可以做一些逻辑嵌套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。

答案 2 :(得分: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演员,但没有理由不使用字符串方法进行正常操作。