powershell - витягнути ім'я файлу та розширення


114

Мені потрібно витягти ім'я файлу та розширення, наприклад, з my.file.xlsx. Я не знаю назви файлу чи розширення, і може бути більше крапок в імені, тому мені потрібно шукати рядок справа, і коли я знайду першу крапку (або останню зліва), витягніть частину на правий бік і частина з лівого боку від цієї точки.

Можливо, є краще рішення, але я тут чи деінде нічого не знайшов. Дякую


витяг з текстового файлу чи з чого?
КБ.

Привіт Крістіан, я оновив своє запитання. Мені потрібно витягнути його з імені файлу. Спасибі
культовий

Відповіді:


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повертає розширення, включаючи період (".") .
Охад Шнайдер

Дякую @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 та Extension об’єкта FileInfo.


1
Якусь конкретну інформацію ви хочете? Просто передайте файл Get-Member, щоб розкрити всі його учасники, або перейдіть до MSDN, щоб знайти офіційну допомогу.
Шей Леві

7

Використовуйте розділений шлях

$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, inluding повну зупинку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.