2012-04-25 6 views

risposta

43

Questo richiede due invocazioni di Split-Path AFAICT:

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

grazie! ma nel mio caso ho dovuto specificare -Leaf due volte, anche all'interno delle parentesi dove hai scritto -Parent, nel mio caso volevo il nome più interno della cartella e il mio percorso non conteneva alcun nome di file, solo cartelle. –

+2

Grazie! Il mio era simile! Per me ho usato <(Split-Path "\\ usa0xxxnas.na.xxx.net \ xxxbackups \ T_SQL_Web_Prod \" -leaf)> e mi ha dato la directory T_SQL_Web_Prod. – Michele

3

Se si desidera mantenere le cose semplici e il percorso sta per essere in forma normale, è possibile utilizzare String.Split():

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

altro opzione utilizzando System.Uri:

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

E se il file esiste su disco:

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

+1 Avevo bisogno di ottenere il percorso includendo solo le prime due directory nel percorso originale ed ero in grado di farlo in base alla tua risposta usando '([uri]" c: \ dir1 \ dir2 \ dir3 \ file.txt ") .segmenti [1..3] -join "" "che restituisce' c: \ dir1 \ dir2'. Grazie! –

7

Questa domanda è specificamente chiedendo split-percorso a quanto pare, ma alcuni altri modi sono:

Se il file esiste, trovo che è molto più bello da fare:

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

Se il file non esiste, questo non funzionerà. Un altro modo in questo caso è quello di utilizzare l'API .NET, ad esempio:

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

In generale, se si desidera che il nome della directory ci si trova ho usato questo (grazie a Shay Levi per l'idea originale) :

PS> (dir) .directory.name [0]

Problemi correlati