PowerShell - ekstrak nama file dan ekstensi

114

Saya perlu mengekstrak nama file dan ekstensi dari misalnya my.file.xlsx. Saya tidak tahu nama file atau ekstensi dan mungkin ada lebih banyak titik di namanya, jadi saya perlu mencari string dari kanan dan ketika saya menemukan titik pertama (atau terakhir dari kiri), ekstrak bagian di sisi kanan dan bagian kiri dari titik itu.

Mungkin ada solusi yang lebih baik, tetapi saya tidak menemukan apa pun di sini atau di mana pun. Terima kasih

culter
sumber
ekstrak dari file teks atau dari apa?
CB.
Hai Christian, saya telah memperbarui pertanyaan saya. Saya perlu mengekstraknya dari nama file. Terima kasih
culter

Jawaban:

174

Jika file keluar dari disk dan seperti yang dinyatakan orang lain, gunakan properti BaseNamedan Extension:

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

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

Jika Anda diberi nama file sebagai bagian dari string (katakanlah berasal dari file teks), saya akan menggunakan metode GetFileNameWithoutExtensiondan GetExtensionstatis dari kelas 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
sumber
8
Untuk metode yang lebih berguna di kelas System.IO.Path tanpa mengacu pada dokumentasi MSDN, Anda dapat menggunakan[System.IO.Path] | Get-Member -Static
Phil
2
Perhatikan bahwa [System.IO.Path]::GetExtensionmengembalikan ekstensi termasuk titik (".") .
Ohad Schneider
Terima kasih @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
sumber
13

Jika berasal dari file teks dan dan file nama anggapan dikelilingi oleh spasi putih ini adalah caranya:

$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('.'))) }

Jika adalah file, Anda dapat menggunakan sesuatu seperti ini berdasarkan kebutuhan Anda:

$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.
sumber
9
PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type')
PS C:\Users\joshua> $file.BaseName, $file.Extension
file
.type
Jaqueline Vanek
sumber
8

Periksa properti BaseName dan Ekstensi dari objek FileInfo.

Shay Levy
sumber
1
Adakah informasi khusus yang Anda cari? Cukup kirimkan file ke Get-Member untuk mengungkapkan semua anggotanya atau telusuri MSDN untuk menemukan bantuan resmi.
Shay Levy
7

Gunakan Split-Path

$filePath = "C:\PS\Test.Documents\myTestFile.txt";
$fileName = (Split-Path -Path $filePath -Leaf).Split(".")[0];
$extension = (Split-Path -Path $filePath -Leaf).Split(".")[1];
Ernest Correale
sumber
2
Perhatikan bahwa ini hanya akan berfungsi jika tidak ada titik dalam nama file.
Halfdone
2
Anda dapat mengubahnya untuk Split(".")[-1]membuatnya berfungsi dengan file dengan titik di nama
phuclv
6

lakukan saja:

$file=Get-Item "C:\temp\file.htm"
$file.Basename 
$file.Extension
Esperento57
sumber
1
Saya pikir seharusnya begitu$file.Basename
john v kumpf
0

Ini adalah adaptasi, jika ada yang penasaran. Saya perlu menguji apakah RoboCopy berhasil menyalin satu file ke beberapa server untuk integritasnya:

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

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

Bagus dan sederhana, dan ini menunjukkan direktori dan file di dalamnya. Jika Anda ingin menentukan satu nama file atau ekstensi, cukup ganti * dengan apa pun yang Anda inginkan.

    Directory: \\SERVER\Folder\Share

Mode                LastWriteTime     Length Name                                                                                                                                             
----                -------------     ------ ----                                                                                                                                             
-a---         2/27/2015   5:33 PM    1458935 Test.pptx                                                                                                             
hans57sauc
sumber
0

Pada PowerShell 6.0, Split-Pathmemiliki -Extenstionparameter. Artinya, Anda dapat melakukan:

$path | Split-Path -Extension

atau

Split-Path -Path $path -Extension

Untuk $path = "test.txt"kedua versi akan kembali .txt, termasuk tanda titik.

Jacob Degeling
sumber