powershell - trích xuất tên tệp và phần mở rộng


114

Tôi cần trích xuất tên tệp và phần mở rộng từ ví dụ: my.file.xlsx. Tôi không biết tên tệp hoặc phần mở rộng và có thể có nhiều dấu chấm hơn trong tên, vì vậy tôi cần tìm kiếm chuỗi từ bên phải và khi tôi tìm thấy dấu chấm đầu tiên (hoặc cuối cùng từ bên trái), hãy trích xuất phần trên phần bên phải và phần ở bên trái từ dấu chấm đó.

Có lẽ có giải pháp tốt hơn, nhưng tôi không tìm thấy bất cứ điều gì ở đây hoặc bất kỳ nơi nào khác. Cảm ơn bạn


trích xuất từ ​​một tệp văn bản hoặc từ cái gì?
CB.

Xin chào Christian, tôi đã cập nhật câu hỏi của mình. Tôi cần giải nén nó từ tên của tệp. Cảm ơn
cống

Câu trả lời:


174

Nếu tệp sắp ra khỏi đĩa và như những người khác đã nêu, hãy sử dụng các thuộc tính BaseNameExtension:

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

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

Nếu bạn được cung cấp tên tệp như một phần của chuỗi (giả sử đến từ tệp văn bản), tôi sẽ sử dụng các phương thức GetFileNameWithoutExtensionGetExtensionphương thức tĩnh từ lớp 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
Để biết thêm các phương thức hữu ích trong lớp System.IO.Path mà không cần tham khảo tài liệu MSDN, bạn có thể sử dụng[System.IO.Path] | Get-Member -Static
Phil

2
Lưu ý rằng [System.IO.Path]::GetExtensiontrả về phần mở rộng bao gồm dấu chấm (".") .
Ohad Schneider

Cảm ơn bạn @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

Nếu đến từ một tệp văn bản và tệp tên giả định được bao quanh bởi khoảng trắng thì đây là một cách:

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

Nếu là một tệp, bạn có thể sử dụng một cái gì đó như thế này dựa trên nhu cầu của bạn:

$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

Kiểm tra thuộc tính BaseName và Extension của đối tượng FileInfo.


1
Bạn đang tìm kiếm một món đồ đặc biệt nào? Chỉ cần chuyển một tệp đến Get-Member để tiết lộ tất cả các thành viên của nó hoặc duyệt đến MSDN để tìm trợ giúp chính thức.
Shay Levy

7

Sử dụng 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
Lưu ý rằng điều này sẽ chỉ hoạt động nếu không có dấu chấm trong tên tệp.
Halfdone

2
bạn có thể thay đổi để Split(".")[-1]làm cho nó làm việc với các tập tin với dấu chấm trong tên
phuclv

6

cứ làm đi:

$file=Get-Item "C:\temp\file.htm"
$file.Basename 
$file.Extension

1
Tôi nghĩ nó nên như vậy$file.Basename
john v kumpf

0

Đây là một bản chuyển thể, nếu ai tò mò. Tôi cần kiểm tra xem RoboCopy đã sao chép thành công một tệp sang nhiều máy chủ để đảm bảo tính toàn vẹn của nó hay không:

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

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

Đẹp và đơn giản, nó hiển thị thư mục và tệp bên trong nó. Nếu bạn muốn chỉ định một tên tệp hoặc phần mở rộng, chỉ cần thay thế dấu * bằng bất kỳ tên nào bạn muốn.

    Directory: \\SERVER\Folder\Share

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

0

Kể từ PowerShell 6.0, Split-Pathcó một -Extenstiontham số. Điều này có nghĩa là bạn có thể làm:

$path | Split-Path -Extension

hoặc là

Split-Path -Path $path -Extension

Đối với $path = "test.txt"cả hai phiên bản sẽ trở lại .txt, bao gồm cả điểm dừng hoàn toàn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.