powershell - dosya adını ve uzantısını çıkar


114

Dosya adını ve uzantısını örneğin my.file.xlsx'ten almam gerekiyor. Dosya veya uzantının adını bilmiyorum ve adda daha fazla nokta olabilir, bu yüzden dizeyi sağdan aramam gerekiyor ve ilk noktayı (veya soldan son) bulduğumda, sağ taraf ve o noktadan sol taraftaki kısım.

Belki daha iyi bir çözüm vardır, ama burada veya başka bir yerde bir şey bulamadım. teşekkür ederim


bir metin dosyasından veya neyden çıkarmak?
CB.

Merhaba Christian, sorumu güncelledim. Dosyanın adından çıkarmam gerekiyor. Teşekkürler
culter

Yanıtlar:


174

Dosya diskten çıkıyorsa ve diğerlerinin belirttiği gibi, BaseNameve Extensionözelliklerini kullanın :

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

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

Dosya adı dizenin bir parçası olarak verilirse (örneğin bir metin dosyasından geliyorsa), System.IO.Path sınıfındaki GetFileNameWithoutExtensionand GetExtensionstatic yöntemlerini kullanırdım :

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 sınıfında MSDN belgelerine başvurmadan daha yararlı yöntemler için şunu kullanabilirsiniz[System.IO.Path] | Get-Member -Static
Phil

2
Nokta (".")[System.IO.Path]::GetExtension İçeren uzantıyı döndürdüğünü unutmayın .
Ohad Schneider

Teşekkür ederim @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

Bir metin dosyasındansa ve varsayılan ad dosyası beyaz boşluklarla çevriliyse, bu bir yoldur:

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

Bir dosya ise, ihtiyaçlarınıza göre buna benzer bir şey kullanabilirsiniz:

$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

FileInfo nesnesinin BaseName ve Extension özelliklerini kontrol edin.


1
Peşinde olduğunuz belirli bir bilgi var mı? Tüm üyelerini ortaya çıkarmak için bir dosyayı Get-Member'a yönlendirin veya resmi yardımı bulmak için MSDN'ye göz atın.
Shay Levy

7

Bölünmüş Yol Kullan

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

2
Bunun yalnızca dosya adında nokta yoksa işe yarayacağını unutmayın.
Halfdone

2
Split(".")[-1]adında noktalı dosyalarla çalışmasını sağlamak için değiştirebilirsiniz
phuclv


0

Meraklı biri varsa bu bir uyarlamadır. RoboCopy'nin bir dosyayı bütünlüğü için birden çok sunucuya başarıyla kopyalayıp kopyalayıp kopyalamadığını test etmem gerekiyordu:

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

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

Güzel ve basit ve dizini ve içindeki dosyayı gösterir. Bir dosya adı veya uzantı belirtmek istiyorsanız, sadece * 'leri istediğiniz gibi değiştirin.

    Directory: \\SERVER\Folder\Share

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

0

PowerShell 6.0'dan Split-Pathitibaren bir -Extenstionparametre vardır. Bu, şunları yapabileceğiniz anlamına gelir:

$path | Split-Path -Extension

veya

Split-Path -Path $path -Extension

Her $path = "test.txt"iki sürüm için .txt, tam durdurma dahil olmak üzere geri dönecektir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.