Извлечь имя файла из пути


83

Я хочу извлечь имя файла из пути ниже:

D: \ Сервер \ Пользователь \ CUST \ MEA \ Data \ In \ Files \ CORRECTED \ CUST_MEAFile.csv

Теперь я написал этот код, чтобы получить имя файла. Это работает нормально, пока уровень папки не изменился. Но если уровень папки был изменен, этот код нужно переписать. Я ищу способ сделать его более гибким, например, код всегда может извлекать имя файла независимо от уровня папки.

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

Ответы:


164

Если вы согласны с включением расширения, оно должно делать то, что вы хотите.

$outputPath = "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
$outputFile = Split-Path $outputPath -leaf

6
Это отличный ответ. Решает проблему самым «встроенным» способом. Однако для моих нужд мне понадобились как имя файла с расширением, так и базовое имя файла, поэтому я использовал ответ @ angularsen. Есть еще один параметр -leafbase, но он поддерживается только в PowerShell Core 6+.
Джейми

62

Использовать :

[System.IO.Path]::GetFileName("c:\foo.txt")возвращается foo.txt. [System.IO.Path]::GetFileNameWithoutExtension("c:\foo.txt")возвращаетсяfoo


16

Использование BaseName в Get-ChildItem отображает имя файла, а использование Name отображает имя файла с расширением.

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

$filepath.BaseName

Basic-English-Grammar-1

$filepath.Name

Basic-English-Grammar-1.pdf

4

Вы можете получить желаемый результат вот так.

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

Если вы используете «Get-ChildItem» для получения «полного имени», вы также можете использовать «имя», чтобы просто получить имя файла.


6
Просто используйте индекс, -1если вы используете метод массивов:$file.Split("\")[-1]
Ансгар Вихерс

Если мы хотим удалить расширение, что мы можем сделать?
Souradeep Banerjee-AIS

4
Get-ChildItem "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
|Select-Object -ExpandProperty Name

3

Просто чтобы завершить ответ выше, используйте .Net.

В этом коде путь хранится в %1аргументе (который записывается в реестре под экранированной кавычкой:) \"%1\". Чтобы получить его, нам понадобится $arg(встроенный аргумент). Не забывайте цитату вокруг $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

Вы можете попробовать это:

[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

Найдите файл, используя подстановочный знак и получив имя файла:

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

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

Работает как с относительными, так и с абсолютными путями

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.