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

83

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

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

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

($outputFile).split('\')[9].substring(0)
user664481
источник

Ответы:

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

Angularsen
источник
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
$(Split-Path "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv" -leaf)
Иэн
источник
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

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

рависильва
источник