powershell - извлечь имя и расширение файла

114

Мне нужно извлечь имя и расширение файла, например, из my.file.xlsx. Я не знаю имени файла или расширения, и в имени может быть больше точек, поэтому мне нужно найти строку справа, и когда я найду первую точку (или последнюю слева), извлеките часть на правая сторона и часть слева от этой точки.

Может быть, есть лучшее решение, но я не нашел ничего ни здесь, ни где-либо еще. Спасибо

Culter
источник
извлечь из текстового файла или из чего?
CB.
Привет, Кристиан, я обновил свой вопрос. Мне нужно извлечь его из имени файла. Спасибо
culter

Ответы:

174

Если файл отрываясь диска и , как другие утверждали, используют BaseNameи Extensionсвойства:

PS C:\> dir *.xlsx | select BaseName,Extension

BaseName                                Extension
--------                                ---------
StackOverflow.com Test Config           .xlsx  

Если вам дано имя файла как часть строки (скажем, из текстового файла), я бы использовал GetFileNameWithoutExtensionи GetExtensionстатические методы из класса System.IO.Path :

PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("Test Config.xlsx")
Test Config
PS H:\> [System.IO.Path]::GetExtension("Test Config.xlsx")
.xlsx
Goyuix
источник
9
Для получения более полезных методов в классе System.IO.Path, не обращаясь к документации MSDN, вы можете использовать[System.IO.Path] | Get-Member -Static
Фил
2
Обратите внимание, что [System.IO.Path]::GetExtensionвозвращает расширение, включая точку (".") .
Охад Шнайдер
Спасибо @OhadSchneider
m1m1k
24
PS C:\Windows\System32\WindowsPowerShell\v1.0>split-path "H:\Documents\devops\tp-mkt-SPD-38.4.10.msi" -leaf
tp-mkt-SPD-38.4.10.msi

PS C:\Windows\System32\WindowsPowerShell\v1.0> $psversiontable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.5477
BuildVersion                   6.1.7601.17514
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1
Straff
источник
13

Если из текстового файла и предполагаемое имя файла окружены пробелами, это способ:

$a = get-content c:\myfile.txt

$b = $a | select-string -pattern "\s.+\..{3,4}\s" | select -ExpandProperty matches | select -ExpandProperty value

$b | % {"File name:{0} - Extension:{1}" -f $_.substring(0, $_.lastindexof('.')) , $_.substring($_.lastindexof('.'), ($_.length - $_.lastindexof('.'))) }

Если это файл, вы можете использовать что-то вроде этого в зависимости от ваших потребностей:

$a = dir .\my.file.xlsx # or $a = get-item c:\my.file.xlsx 

$a
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\ps


Mode           LastWriteTime       Length Name
----           -------------       ------ ----
-a---      25/01/10    11.51          624 my.file.xlsx


$a.BaseName
my.file
$a.Extension
.xlsx
CB.
источник
9
PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type')
PS C:\Users\joshua> $file.BaseName, $file.Extension
file
.type
Жаклин Ванек
источник
8

Проверьте свойства BaseName и Extension объекта FileInfo.

Шэй Леви
источник
1
Вам нужна какая-то конкретная информация? Просто отправьте файл в Get-Member, чтобы раскрыть всех его участников, или перейдите в MSDN, чтобы найти официальную помощь.
Шей Леви,
7

Использовать разделенный путь

$filePath = "C:\PS\Test.Documents\myTestFile.txt";
$fileName = (Split-Path -Path $filePath -Leaf).Split(".")[0];
$extension = (Split-Path -Path $filePath -Leaf).Split(".")[1];
Эрнест Корреале
источник
2
Обратите внимание, что это будет работать, только если в имени файла нет точек.
Halfdone
2
вы можете изменить на, Split(".")[-1]чтобы он работал с файлами с точками в имени
phuclv
6

просто сделай это:

$file=Get-Item "C:\temp\file.htm"
$file.Basename 
$file.Extension
Эсперенто57
источник
1
Думаю, так и должно быть$file.Basename
Джон в Кампф
0

Это адаптация, если кому интересно. Мне нужно было проверить, успешно ли RoboCopy скопировал один файл на несколько серверов на предмет его целостности:

   $Comp = get-content c:\myfile.txt

ForEach ($PC in $Comp) {
    dir "\\$PC\Folder\Share\*.*" | Select-Object $_.BaseName
}

Красиво и просто, и он показывает каталог и файл внутри него. Если вы хотите указать одно имя файла или расширение, просто замените * на то, что хотите.

    Directory: \\SERVER\Folder\Share

Mode                LastWriteTime     Length Name                                                                                                                                             
----                -------------     ------ ----                                                                                                                                             
-a---         2/27/2015   5:33 PM    1458935 Test.pptx                                                                                                             
hans57sauc
источник
0

Начиная с PowerShell 6.0, Split-Pathимеет -Extenstionпараметр. Это означает, что вы можете:

$path | Split-Path -Extension

или

Split-Path -Path $path -Extension

Для $path = "test.txt"обеих версий вернется .txt, включая точку.

Джейкоб Дегелинг
источник