2015-06-20 81 views
3

我想写一个PowerShell的自定义提示,我想知道如何筛选出Get-Location的输出中的1 ... n目录。如何从Get-Location输出中删除部分路径?

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

所以,如果路径太长,我想省略一些目录,只是显示PS...blah\blah>什么的。我试过(get-container) - 1但它不起作用。

+2

你是否想过只显示最后的x个目录?拆分路径是一个简单的方法去! – Matt

回答

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转换,但没有理由不对正常操作使用字符串方法。

+0

总是忘记URI转换 – Matt

+0

@Matt谢谢,看到了,但添加了一个字符串方法,所以没有得到编辑:) – JGreenwell

+0

我可能是错的,但是你的“字符串”代码有缺陷,因为你使用的是字符串方法分裂。它不支持正则表达式,你匹配_two_斜杠 – Matt

3

使用Split-Path-Leaf参数,如果你想只是一个路径的最后一个元素:

function prompt { 
    "PS {0}> " -f (Split-Path -Leaf (Get-Location)) 
} 
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.