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)

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

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


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

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.


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

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

3
$(Split-Path "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv" -leaf)

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

2

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

Resolve-Path "Package.1.0.191.*.zip" | Split-Path -leaf

1
$file = Get-Item -Path "c:/foo/foobar.txt"
$file.Name

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.