2012-03-20 46 views
86

Tôi cần trích xuất tên tệp và tiện ích mở rộng từ ví dụ: my.file.xlsx. Tôi không biết tên của tập tin 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 phải 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), trích xuất phần trên phía bên phải và phần bên trái từ chấm đó.powershell - trích xuất tên tệp và tiện ích mở rộng

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

+0

chiết xuất từ ​​một tập tin văn bản hoặc từ những gì? –

+0

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

Trả lời

125

Nếu tập tin được sắp tắt đĩa và như những người khác đã nói, sử dụng BaseNameExtension tính:

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

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

Nếu bạn được theo tên tập tin như là một phần của chuỗi (nói đến từ một tập tin văn bản), tôi sẽ sử dụng phương pháp tĩnh GetFileNameWithoutExtensionGetExtension 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 
+5

Đối với các phương thức hữu ích hơn 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

+0

Lưu ý rằng '[System.IO.Path] :: GetExtension' trả về phần mở rộng * bao gồm dấu chấm (". ") *. –

11

Nếu là từ một tập tin văn bản và và giả sử tập tin tên được bao quanh bởi không gian màu trắng nà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 tin mà 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 
7

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

+1

Bất kỳ infoyou're cụ thể sau? Chỉ cần gửi một tập tin vào 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 sự trợ giúp chính thức. –

0

Đây là một sự thích nghi, nếu có ai là tò mò. Tôi cần kiểm tra xem liệu RoboCopy có sao chép thành công một tệp tới nhiều máy chủ cho tính toàn vẹn của nó hay không:

Đẹp và đơn giản, và 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 tin hoặc phần mở rộng, chỉ cần thay thế * với bất cứ điều gì bạn muốn.

Directory: \\SERVER\Folder\Share 

Mode    LastWriteTime  Length Name                                    
----    -------------  ------ ----                                    
-a---   2/27/2015 5:33 PM 1458935 Test.pptx                            
18
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 
4
PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type') 
PS C:\Users\joshua> $file.BaseName, $file.Extension 
file 
.type 
4

Sử dụng Split-Đường dẫn

$filePath = "C:\PS\Test.Documents\myTestFile.txt"; 
$fileName = (Split-Path -Path $filePath -Leaf).Split(".")[0]; 
$extension = (Split-Path -Path $filePath -Leaf).Split(".")[1]; 
0

chỉ làm điều đó:

$file=Get-Item "C:\temp\file.htm" 
$file.Name 
$file.Extension 
Các vấn đề liên quan