2013-02-08 17 views
9

Ho un percorso assoluto in una variabile nel mio script PowerShell 2.0. Voglio rimuovere l'estensione ma mantenere il percorso completo e il nome del file. Il modo più semplice per farlo?Come si ottiene un percorso file senza estensione in PowerShell?

Quindi, se ho C:\Temp\MyFolder\mytextfile.fake.ext.txt in una variabile chiamata, dico $file

voglio tornare

C:\Temp\MyFolder\mytextfile.fake.ext

risposta

17

se è un tipo [string]:

$file.Substring(0, $file.LastIndexOf('.')) 

se è un [system.io.fileinfo] tipo:

join-path $File.DirectoryName $file.BaseName 

oppure si può lanciarlo:

join-path ([system.io.fileinfo]$File).DirectoryName ([system.io.fileinfo]$file).BaseName 
+0

Si tratta di un [string ] genere. Se volessi renderlo più robusto e far fronte a una lunghezza di estensione variabile? Cosa succede se ho un file '.pl' o un file' .blahblah'? –

+1

@MarkAllison Soluzioni aggiunte .. –

+0

'$ file.Substring (0, $ file.LastIndexOf ('.'))' È una buona soluzione. Ma casi di mind 2: 1) nessuna estensione e un punto nel mezzo: 'C: \ Tests.1 \ FileNoExtension' risulta in 'C: \ Tests'; 2) nessun punto a tutti i risultati in un'eccezione. –

4
# the path 
$file = 'C:\Temp\MyFolder\mytextfile.fake.ext.txt' 

# using regular expression 
$file -replace '\.[^.\\/]+$' 

# or using System.IO.Path (too verbose but useful to know) 
Join-Path ([System.IO.Path]::GetDirectoryName($file)) ([System.IO.Path]::GetFileNameWithoutExtension($file)) 
+2

Se hai accesso al file puoi anche usare: 'Get-Item $ yourpathvar | % {$ _. FullName -replace $ _. Extension} ' –

+0

@Graimer: Penso che questo non sia corretto. 1) stringa '$ _. Extension' potrebbe trovarsi anche nel mezzo del percorso. 2) Può contenere caratteri regex speciali come '[]'. –

+0

Mi dispiace di non aver visto i caratteri regex nascosti nel suo esempio. Molte persone non usano caratteri speciali in un'estensione. Per quanto riguarda il punto uno, per favore mostrami un esempio in cui l'estensione si trova nel mezzo di un percorso (che esiste). Non sto dicendo che il mio era migliore, solo una versione più facile da leggere per il normale uso del giorno :) –

3

si dovrebbe utilizzare il metodo semplice framework .NET, invece di cobbling insieme parti di percorso o fare sostituzioni.

PS> [System.IO.Path]::GetFileNameWithoutExtension($file) 

https://msdn.microsoft.com/en-us/library/system.io.path.getfilenamewithoutextension%28v=vs.110%29.aspx

+0

OP ha chiesto come ottenere il file _path_ senza un'estensione. Questo non lo fa.Piuttosto, ':: GetFileNameWithoutExtension()' restituisce il nome del file spogliato del percorso e dell'estensione. – alx9r

0

Indipendentemente dal fatto che $file è string o FileInfo oggetto:

(Get-Item $file).BaseName 
6

Qui è il modo migliore che io preferisco e altri esempi:

 
$FileNamePath 
(Get-Item $FileNamePath).Extension 
(Get-Item $FileNamePath).Basename 
(Get-Item $FileNamePath).Name 
(Get-Item $FileNamePath).DirectoryName 
(Get-Item $FileNamePath).FullName 

+0

Perché le persone rispondono alle domande che hanno una risposta accettata di tre anni fa? –

+2

Perché ci sono soluzioni più efficienti invece di codice complesso. – Antebios

+0

Sarebbe bello se avessi fornito alcuni commenti accanto a ciascuna riga che mostra cosa esattamente verrebbe restituito. – deadlydog

Problemi correlati