2012-04-25 11 views

Odpowiedz

43

To trwa dwie inwokacje o Split-Path AFAICT:

PS> Split-Path (Split-Path c:\dir1\dir2\dir3\file.txt -Parent) -Leaf 
dir3 
+0

dzięki! ale w moim przypadku musiałem dwukrotnie określić -Leaf, również w nawiasach, w których napisałeś -Parent, w moim przypadku chciałem uzyskać najbardziej wewnętrzną nazwę folderu, a moja ścieżka nie zawierała żadnej nazwy pliku, tylko foldery. –

+2

Dzięki! Mój był podobny! Dla mnie użyłem <(Split-Path "\\ usa0xxxnas.na.xxx.net \ xxxbackups \ T_SQL_Web_Prod \" -leaf)> i dało mi to katalog T_SQL_Web_Prod. – Michele

3

Jeśli chcesz zachować to proste, a droga będzie w normalnej formie, można użyć String.Split():

"c:\dir1\dir2\dir3\file.txt".split("\")[-2] 
3

Innym opcja przy użyciu System.Uri:

PS> ([uri]"c:\dir1\dir2\dir3\file.txt").segments[-2].trim('/') 
dir3 

A jeśli plik istnieje na dysku:

PS> (dir c:\dir1\dir2\dir3\file.txt).directory.name 
+1

+1 Potrzebowałem uzyskać ścieżkę zawierającą tylko pierwsze dwa katalogi w oryginalnej ścieżce i mogłem to zrobić na podstawie Twojej odpowiedzi za pomocą '([uri]" c: \ dir1 \ dir2 \ dir3 \ plik.txt ") .segments [1..3] -join "" ', który zwraca' c: \ dir1 \ dir2'. Dziękuję Ci! –

7

To pytanie jest szczególnie prośbą o podzielonym ścieżce wydaje, ale niektóre inne sposoby to:

Jeśli plik istnieje, uważam, że jest o wiele ładniejszy zrobić:

(Get-Item c:\dir1\dir2\dir3\file.txt).Directory.Name 

Jeśli plik nie istnieje, to nie zadziała. Innym sposobem, w tym przypadku jest użycie API .NET, na przykład:

$path = [System.IO.Path]; 
$path::GetFileName($path::GetDirectoryName("c:\dir1\dir2\dir3\file.txt")) 
1

W ogóle, jeśli chcesz nazwę katalogu jesteś w użyłem tego (dzięki Shay Lewiego do oryginalnego pomysłu) :

ps> (kierunek) .directory.name [0]

Powiązane problemy