2013-02-08 7 views
9

Ich habe einen absoluten Pfad in einer Variablen in meinem Powershell 2.0-Skript. Ich möchte die Erweiterung entfernen, aber den vollständigen Pfad und den Dateinamen behalten. Der einfachste Weg, das zu tun?Wie erhalte ich einen Dateipfad ohne Erweiterung in PowerShell?

Also, wenn ich C:\Temp\MyFolder\mytextfile.fake.ext.txt in einer Variablen namens haben, sagen $file

I

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

Antwort

17

zurückkehren wollen, wenn ein [string] Typ ist:

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

wenn ein [system.io.fileinfo] Typ:

join-path $File.DirectoryName $file.BaseName 

oder Sie können sie Stimmen:

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

Es ist ein [string ] Art. Wenn ich es robuster machen und eine variable Auszugslänge bewältigen wollte? Was ist, wenn ich eine '.pl' Datei oder eine' .blahblah' Datei habe? –

+1

@MarkAllison Hinzugefügte Lösungen .. –

+0

'$ file.Substring (0, $ file.LastIndexOf ('.'))' Ist ein guter. Aber beachten Sie 2 Fälle: 1) keine Erweiterung und ein Punkt in der Mitte: 'C: \ Tests.1 \ FileNoExtension' führt zu 'C: \ Tests'; 2) keine Punkte ergeben eine Ausnahme. –

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

Wenn Sie Zugriff auf die Datei haben, können Sie auch folgendes verwenden: 'Get-Item $ yourpathvar | % {$ _. FullName -replace $ _. Extension} ' –

+0

@Graimer: Ich denke, das ist nicht korrekt. 1) String '$ _. Extension' kann auch in der Mitte des Pfades stehen. 2) Es kann spezielle Regex-Zeichen wie '[]' enthalten. –

+0

Es tut mir leid, dass ich die versteckten Regex-Zeichen in seinem Beispiel nicht gesehen habe. Die meisten Leute benutzen keine Sonderzeichen in einer Erweiterung. Was Ihren Punkt angeht, zeigen Sie mir bitte ein Beispiel, wo die Erweiterung in der Mitte eines Pfades ist (welcher existiert). Ich sage nicht, dass meins besser ist, nur eine leichter zu lesende Version für normalen Gebrauch :) –

3

Sie sollen die einfache .NET Framework-Methode verwenden, statt Pfad Teile Schuster zusammen oder Ersatz zu tun.

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

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

+0

OP fragte, wie man die Datei _path_ ohne eine Erweiterung bekommt. Das macht das nicht.Stattdessen gibt ':: GetFileNameWithoutExtension()' den Dateinamen zurück, der sowohl vom Pfad als auch von der Erweiterung entfernt wurde. – alx9r

0

Unabhängig davon, ob $file ist string oder FileInfo Objekt:

(Get-Item $file).BaseName 
6

Hier ist der beste Weg, ich und andere Beispiele bevorzugen:

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

+0

Warum beantworten Menschen Fragen, die vor drei Jahren eine akzeptierte Antwort hatten? –

+2

Weil es effizientere Lösungen anstelle von komplexem Code gibt. – Antebios

+0

Es wäre nett, wenn Sie neben jeder Zeile einige Kommentare geben würden, die zeigen, was genau zurückgegeben werden würde. – deadlydog

Verwandte Themen