powershell - แยกชื่อไฟล์และนามสกุล


114

ฉันต้องการแยกชื่อไฟล์และนามสกุลจากเช่น my.file.xlsx ฉันไม่รู้ชื่อไฟล์หรือนามสกุลและอาจมีจุดมากกว่านี้ในชื่อดังนั้นฉันต้องค้นหาสตริงจากด้านขวาและเมื่อฉันพบจุดแรก (หรือสุดท้ายจากด้านซ้าย) ให้แยกส่วนบน ด้านขวาและส่วนทางด้านซ้ายจากจุดนั้น

อาจมีทางออกที่ดีกว่านี้ แต่ฉันไม่พบอะไรที่นี่หรือที่อื่น ขอบคุณ


แยกจากไฟล์ข้อความหรือจากอะไร
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

9
สำหรับวิธีการที่มีประโยชน์มากขึ้นในคลาส System.IO.Path โดยไม่ต้องอ้างถึงเอกสาร MSDN คุณสามารถใช้ได้[System.IO.Path] | Get-Member -Static
Phil

2
โปรดทราบว่า[System.IO.Path]::GetExtensionผลตอบแทนการขยายรวมถึงงวด ( "")
Ohad Schneider

ขอบคุณ @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

หากมาจากไฟล์ข้อความและและไฟล์ชื่อที่สันนิษฐานว่าถูกล้อมรอบด้วยช่องว่างสีขาวนี่เป็นวิธี:

$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


8

ตรวจสอบคุณสมบัติ BaseName และส่วนขยายของอ็อบเจ็กต์ FileInfo


1
มีอะไรพิเศษที่คุณตามมา? เพียงแค่ไพพ์ไฟล์ไปยัง Get-Member เพื่อเปิดเผยสมาชิกทั้งหมดหรือเรียกดู MSDN เพื่อค้นหาความช่วยเหลืออย่างเป็นทางการ
Shay Levy

7

ใช้ 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
โปรดทราบว่าสิ่งนี้จะใช้ได้เฉพาะเมื่อไม่มีจุดในชื่อไฟล์
Halfdone

2
คุณสามารถเปลี่ยนเพื่อSplit(".")[-1]ให้ใช้งานได้กับไฟล์ที่มีจุดในชื่อ
phuclv


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                                                                                                             

0

ตั้งแต่ PowerShell 6.0 Split-Pathมี-Extenstionพารามิเตอร์ ซึ่งหมายความว่าคุณสามารถทำได้:

$path | Split-Path -Extension

หรือ

Split-Path -Path $path -Extension

สำหรับ$path = "test.txt"ทั้งสองเวอร์ชันจะกลับมา.txtรวมถึงการหยุดแบบเต็ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.