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


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

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

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

9
PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type')
PS C:\Users\joshua> $file.BaseName, $file.Extension
file
.type

8

Periksa properti BaseName dan Ekstensi dari objek FileInfo.


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];

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

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                                                                                                             

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.