Powershell - Dateiname und -erweiterung extrahieren


114

Ich muss den Dateinamen und die Erweiterung aus zB my.file.xlsx extrahieren. Ich kenne den Namen der Datei oder Erweiterung nicht und der Name enthält möglicherweise mehr Punkte. Daher muss ich die Zeichenfolge von rechts durchsuchen und, wenn ich den ersten Punkt (oder den letzten von links) finde, den Teil auf der Seite extrahieren rechte Seite und der Teil auf der linken Seite von diesem Punkt.

Vielleicht gibt es eine bessere Lösung, aber ich habe hier oder anderswo nichts gefunden. Danke dir


Auszug aus einer Textdatei oder aus was?
CB.

Hallo Christian, ich habe meine Frage aktualisiert. Ich muss es aus dem Namen der Datei extrahieren. Danke
Culter

Antworten:


173

Wenn die Datei von der Festplatte kommt und wie von anderen angegeben, verwenden Sie die Eigenschaften BaseNameund Extension:

PS C:\> dir *.xlsx | select BaseName,Extension

BaseName                                Extension
--------                                ---------
StackOverflow.com Test Config           .xlsx  

Wenn Sie die Dateinamen als Teil der Zeichenfolge angegeben werden (etwa aus einer Textdatei kommt), würde ich die Verwendung GetFileNameWithoutExtensionund GetExtensionstatische Methoden aus der System.IO.Path Klasse:

PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("Test Config.xlsx")
Test Config
PS H:\> [System.IO.Path]::GetExtension("Test Config.xlsx")
.xlsx

8
Für nützlichere Methoden in der System.IO.Path-Klasse ohne Bezugnahme auf die MSDN-Dokumentation können Sie verwenden[System.IO.Path] | Get-Member -Static
Phil

2
Beachten Sie, dass [System.IO.Path]::GetExtensiondie Erweiterung einschließlich des Punkts (".") Zurückgegeben wird .
Ohad Schneider

Vielen Dank @OhadSchneider
m1m1k

24
PS C:\Windows\System32\WindowsPowerShell\v1.0>split-path "H:\Documents\devops\tp-mkt-SPD-38.4.10.msi" -leaf
tp-mkt-SPD-38.4.10.msi

PS C:\Windows\System32\WindowsPowerShell\v1.0> $psversiontable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.5477
BuildVersion                   6.1.7601.17514
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1

13

Wenn es sich um eine Textdatei handelt und eine vermutete Namensdatei von Leerzeichen umgeben ist, ist dies eine Möglichkeit:

$a = get-content c:\myfile.txt

$b = $a | select-string -pattern "\s.+\..{3,4}\s" | select -ExpandProperty matches | select -ExpandProperty value

$b | % {"File name:{0} - Extension:{1}" -f $_.substring(0, $_.lastindexof('.')) , $_.substring($_.lastindexof('.'), ($_.length - $_.lastindexof('.'))) }

Wenn es sich um eine Datei handelt, können Sie so etwas je nach Ihren Anforderungen verwenden:

$a = dir .\my.file.xlsx # or $a = get-item c:\my.file.xlsx 

$a
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\ps


Mode           LastWriteTime       Length Name
----           -------------       ------ ----
-a---      25/01/10    11.51          624 my.file.xlsx


$a.BaseName
my.file
$a.Extension
.xlsx

9
PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type')
PS C:\Users\joshua> $file.BaseName, $file.Extension
file
.type

8

Überprüfen Sie die Eigenschaften BaseName und Extension des FileInfo-Objekts.


1
Sind Sie auf der Suche nach bestimmten Informationen? Leiten Sie einfach eine Datei an Get-Member weiter, um alle Mitglieder anzuzeigen, oder navigieren Sie zu MSDN, um die offizielle Hilfe zu finden.
Shay Levy

7

Verwenden Sie den geteilten Pfad

$filePath = "C:\PS\Test.Documents\myTestFile.txt";
$fileName = (Split-Path -Path $filePath -Leaf).Split(".")[0];
$extension = (Split-Path -Path $filePath -Leaf).Split(".")[1];

2
Beachten Sie, dass dies nur funktioniert, wenn der Dateiname keine Punkte enthält.
Halfdone

2
Sie können ändern, Split(".")[-1]damit es mit Dateien mit Punkten im Namen
funktioniert

6

Mach es einfach:

$file=Get-Item "C:\temp\file.htm"
$file.Basename 
$file.Extension

1
Ich denke, es sollte sein$file.Basename
John v Kumpf

0

Dies ist eine Anpassung, wenn jemand neugierig ist. Ich musste testen, ob RoboCopy eine Datei erfolgreich auf mehrere Server kopiert hat, um ihre Integrität zu gewährleisten:

   $Comp = get-content c:\myfile.txt

ForEach ($PC in $Comp) {
    dir "\\$PC\Folder\Share\*.*" | Select-Object $_.BaseName
}

Schön und einfach, und es zeigt das Verzeichnis und die Datei darin. Wenn Sie einen Dateinamen oder eine Dateierweiterung angeben möchten, ersetzen Sie einfach die * durch die gewünschten.

    Directory: \\SERVER\Folder\Share

Mode                LastWriteTime     Length Name                                                                                                                                             
----                -------------     ------ ----                                                                                                                                             
-a---         2/27/2015   5:33 PM    1458935 Test.pptx                                                                                                             

0

Hat ab PowerShell 6.0 Split-Patheinen -ExtenstionParameter. Dies bedeutet, dass Sie Folgendes tun können:

$path | Split-Path -Extension

oder

Split-Path -Path $path -Extension

Für $path = "test.txt"beide Versionen wird zurückgegeben .txt, einschließlich des Punktes.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.