Extrahieren Sie den Dateinamen aus einem Pfad

80

Ich möchte den Dateinamen aus dem folgenden Pfad extrahieren:

D: \ Server \ Benutzer \ CUST \ MEA \ Data \ In \ Files \ CORRECTED \ CUST_MEAFile.csv

Jetzt habe ich diesen Code geschrieben, um den Dateinamen zu erhalten. Dies funktioniert einwandfrei, solange sich die Ordnerebene nicht geändert hat. Falls die Ordnerebene geändert wurde, muss dieser Code neu geschrieben werden. Ich suche nach einer Möglichkeit, es flexibler zu gestalten, da der Code unabhängig von der Ordnerebene immer den Dateinamen extrahieren kann.

($outputFile).split('\')[9].substring(0)
user664481
quelle

Antworten:

160

Wenn Sie mit der Erweiterung einverstanden sind, sollte dies tun, was Sie wollen.

$outputPath = "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
$outputFile = Split-Path $outputPath -leaf
Gordon
quelle
6
Dies ist eine großartige Antwort. Es löst das Problem auf die "am meisten eingebaute" Weise. Für meine Bedürfnisse benötigte ich jedoch sowohl den Dateinamen mit Erweiterung als auch den Basisdateinamen, also habe ich die Antwort von @ angularsen verwendet. Es gibt einen weiteren Parameter, -leafbase, der jedoch nur von PowerShell Core 6+ unterstützt wird.
Jamie
59

Verwenden ::

[System.IO.Path]::GetFileName("c:\foo.txt")kehrt zurück foo.txt. [System.IO.Path]::GetFileNameWithoutExtension("c:\foo.txt")kehrt zurückfoo

eckig
quelle
14

Wenn Sie den Basisnamen in Get-ChildItem verwenden, wird der Name der Datei und bei Verwendung des Namens der Dateiname mit der Erweiterung angezeigt.

$filepath = Get-ChildItem "E:\Test\Basic-English-Grammar-1.pdf"

$filepath.BaseName

Basic-English-Grammar-1

$filepath.Name

Basic-English-Grammar-1.pdf
Sudhir Tharayil
quelle
4

Sie könnten das gewünschte Ergebnis erhalten.

$file = "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
$a = $file.Split("\")
$index = $a.count - 1
$a.GetValue($index)

Wenn Sie "Get-ChildItem" verwenden, um den "vollständigen Namen" abzurufen, können Sie auch "name" verwenden, um nur den Namen der Datei abzurufen.

David
quelle
5
Verwenden -1Sie einfach den Index, wenn Sie den Array-Ansatz $file.Split("\")[-1]
wählen
Was können wir tun, wenn wir die Erweiterung entfernen möchten?
Souradeep Banerjee-AIS
4
Get-ChildItem "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
|Select-Object -ExpandProperty Name
Ian Kemp
quelle
3

Um die obige Antwort zu vervollständigen, verwenden Sie .Net.

In diesem Code wird der Pfad im %1Argument gespeichert (das in der Registrierung unter Anführungszeichen geschrieben ist, die maskiert sind :) \"%1\". Um es abzurufen, benötigen wir das $arg(eingebaute Argument). Vergessen Sie nicht das Zitat herum $FilePath.

# Get the File path:  
$FilePath = $args
Write-Host "FilePath: " $FilePath

# Get the complete file name:
$file_name_complete = [System.IO.Path]::GetFileName("$FilePath")
Write-Host "fileNameFull :" $file_name_complete

# Get File Name Without Extension:
$fileNameOnly = [System.IO.Path]::GetFileNameWithoutExtension("$FilePath")
Write-Host "fileNameOnly :" $fileNameOnly

# Get the Extension:
$fileExtensionOnly = [System.IO.Path]::GetExtension("$FilePath")
Write-Host "fileExtensionOnly :" $fileExtensionOnly
J. Does
quelle
3
$(Split-Path "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv" -leaf)
Iain
quelle
2

Sie können dies versuchen:

[System.IO.FileInfo]$path = "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
# Returns name and extension
$path.Name
# Returns just name
$path.BaseName
Wasif Hasan
quelle
1

Suchen Sie eine Datei mit einem Platzhalter und erhalten Sie den Dateinamen:

Resolve-Path "Package.1.0.191.*.zip" | Split-Path -leaf
Luis Hernandez
quelle
0
$file = Get-Item -Path "c:/foo/foobar.txt"
$file.Name

Funktioniert mit beiden relativen und absoluten Pfaden

Ravisilva
quelle