2015-06-20 78 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.