powershell - wypakuj nazwę i rozszerzenie pliku

114

Muszę wypakować nazwę pliku i rozszerzenie z np. My.file.xlsx. Nie znam nazwy pliku lub rozszerzenia i może być więcej kropek w nazwie, więc muszę przeszukać ciąg z prawej strony, a kiedy znajdę pierwszą kropkę (lub ostatnią od lewej), wyodrębnij część na prawą stronę i część po lewej stronie od tej kropki.

Może jest lepsze rozwiązanie, ale nie znalazłem nic tutaj ani nigdzie indziej. Dziękuję Ci

kulter
źródło
wyciąg z pliku tekstowego czy z czego?
CB.
Cześć Christianie, zaktualizowałem moje pytanie. Muszę wyodrębnić go z nazwy pliku. Dzięki
culter

Odpowiedzi:

174

Jeśli plik schodzi z dysku i jak powiedzieli inni, użyj właściwości BaseNamei Extension:

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

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

Jeśli otrzymałeś nazwę pliku jako część ciągu (powiedzmy pochodzącego z pliku tekstowego), użyłbym metod statycznych GetFileNameWithoutExtensioni GetExtensionz klasy System.IO.Path :

PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("Test Config.xlsx")
Test Config
PS H:\> [System.IO.Path]::GetExtension("Test Config.xlsx")
.xlsx
Goyuix
źródło
9
Aby uzyskać bardziej przydatne metody w klasie System.IO.Path bez odwoływania się do dokumentacji MSDN, możesz użyć[System.IO.Path] | Get-Member -Static
Phil,
2
Zwróć uwagę, że [System.IO.Path]::GetExtensionzwraca rozszerzenie zawierające kropkę („.”) .
Ohad Schneider
Dziękuję @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
Straff
źródło
13

Jeśli pochodzi z pliku tekstowego i przypuszczalnie plik z nazwą jest otoczony spacjami, jest to sposób:

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

Jeśli jest to plik, możesz użyć czegoś takiego w zależności od potrzeb:

$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
CB.
źródło
9
PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type')
PS C:\Users\joshua> $file.BaseName, $file.Extension
file
.type
Jaqueline Vanek
źródło
8

Sprawdź właściwości BaseName i Extension obiektu FileInfo.

Shay Levy
źródło
1
Jakieś konkretne informacje, których szukasz? Po prostu prześlij plik do Get-Member, aby ujawnić wszystkich członków, lub przejdź do MSDN, aby znaleźć oficjalną pomoc.
Shay Levy
7

Użyj 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];
Ernest Correale
źródło
2
Zwróć uwagę, że zadziała to tylko wtedy, gdy w nazwie pliku nie ma kropek.
Halfdone
2
możesz zmienić na, Split(".")[-1]aby działał z plikami z kropkami w nazwie
phuclv
6

po prostu to zrób:

$file=Get-Item "C:\temp\file.htm"
$file.Basename 
$file.Extension
Esperento57
źródło
1
Myślę, że powinno być$file.Basename
john v kumpf
0

To jest adaptacja, jeśli ktoś jest ciekawy. Musiałem sprawdzić, czy RoboCopy pomyślnie skopiował jeden plik na wiele serwerów pod kątem jego integralności:

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

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

Ładny i prosty, pokazuje katalog i plik w nim. Jeśli chcesz określić jedną nazwę pliku lub rozszerzenie, po prostu zamień * na dowolne.

    Directory: \\SERVER\Folder\Share

Mode                LastWriteTime     Length Name                                                                                                                                             
----                -------------     ------ ----                                                                                                                                             
-a---         2/27/2015   5:33 PM    1458935 Test.pptx                                                                                                             
hans57sauc
źródło
0

Począwszy od programu PowerShell 6,0, Split-Pathma -Extenstionparametr. Oznacza to, że możesz:

$path | Split-Path -Extension

lub

Split-Path -Path $path -Extension

Dla $path = "test.txt"obu wersji wróci .txt, w tym kropka.

Jacob Degeling
źródło