Wyodrębnij nazwę pliku ze ścieżki

83

Chcę wyodrębnić nazwę pliku z poniższej ścieżki:

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

Teraz napisałem ten kod, aby uzyskać nazwę pliku. Działa to dobrze, o ile poziom folderu się nie zmienił. Ale w przypadku zmiany poziomu folderu kod ten musi zostać przepisany. Szukam sposobu, aby uczynić go bardziej elastycznym, na przykład kod może zawsze wyodrębnić nazwę pliku niezależnie od poziomu folderu.

($outputFile).split('\')[9].substring(0)
user664481
źródło

Odpowiedzi:

164

Jeśli zgadzasz się na dołączenie rozszerzenia, powinno to zrobić, co chcesz.

$outputPath = "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
$outputFile = Split-Path $outputPath -leaf
Gordon
źródło
6
To świetna odpowiedź. Rozwiązuje problem w najbardziej „wbudowany” sposób. Jednak do moich potrzeb potrzebowałem zarówno nazwy pliku z rozszerzeniem, jak i podstawowej nazwy pliku, więc użyłem odpowiedzi @ angularsen. Istnieje inny parametr -leafbase, ale jest on obsługiwany tylko w programie PowerShell Core 6+.
Jamie
62

Posługiwać się :

[System.IO.Path]::GetFileName("c:\foo.txt")zwraca foo.txt. [System.IO.Path]::GetFileNameWithoutExtension("c:\foo.txt")zwrotyfoo

angularsen
źródło
16

Użycie BaseName w Get-ChildItem wyświetla nazwę pliku, a użycie Name wyświetla nazwę pliku z rozszerzeniem.

$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
źródło
4

Możesz uzyskać taki wynik, jaki chcesz.

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

Jeśli używasz „Get-ChildItem” do uzyskania „pełnej nazwy”, możesz także użyć „name”, aby uzyskać po prostu nazwę pliku.

David
źródło
6
Po prostu użyj indeksu, -1jeśli wybierasz metodę tablicową:$file.Split("\")[-1]
Ansgar Wiechers
Jeśli chcemy usunąć rozszerzenie, co możemy zrobić?
Souradeep Banerjee-AIS
4
Get-ChildItem "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
|Select-Object -ExpandProperty Name
Ian Kemp
źródło
3

Aby uzupełnić powyższą odpowiedź, użyj .Net.

W tym kodzie ścieżka jest przechowywana w %1argumencie (który jest zapisywany w rejestrze pod cudzysłowami, które są chronione:) \"%1\". Aby go odzyskać, potrzebujemy $arg(wbudowanego arg). Nie zapomnij o cytacie $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. Robi
źródło
3
$(Split-Path "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv" -leaf)
Iain
źródło
3

Możesz spróbować tego:

[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
źródło
2

Znajdź plik, używając symboli wieloznacznych i uzyskując nazwę pliku:

Resolve-Path "Package.1.0.191.*.zip" | Split-Path -leaf
Luis Hernandez
źródło
1
$file = Get-Item -Path "c:/foo/foobar.txt"
$file.Name

Działa ze ścieżkami względnymi i bezwzględnymi

ravisilva
źródło