powershell - extrair nome de arquivo e extensão


114

Preciso extrair o nome e a extensão do arquivo de, por exemplo, my.file.xlsx. Não sei o nome do arquivo ou extensão e pode haver mais pontos no nome, então preciso pesquisar a string da direita e quando encontrar o primeiro ponto (ou o último da esquerda), extrair a parte no lado direito e a parte do lado esquerdo desse ponto.

Talvez haja solução melhor, mas não encontrei nada aqui ou em qualquer outro lugar. Obrigado


extrair de um arquivo de texto ou de quê?
CB.

Olá, cristão, atualizei minha pergunta. Preciso extraí-lo do nome do arquivo. Obrigado
culter de

Respostas:


174

Se o arquivo estiver saindo do disco e como outros declararam, use as propriedades BaseNamee Extension:

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

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

Se você receber o nome do arquivo como parte da string (digamos, vindo de um arquivo de texto), eu usaria os métodos estáticos GetFileNameWithoutExtensione GetExtensionda classe 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
Para métodos mais úteis na classe System.IO.Path sem consultar a documentação do MSDN, você pode usar[System.IO.Path] | Get-Member -Static
Phil

2
Observe que [System.IO.Path]::GetExtensionretorna a extensão incluindo o ponto (".") .
Ohad Schneider

Obrigado @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

Se for de um arquivo de texto e um arquivo de nome presumido estiverem cercados por espaços em branco, esta é uma maneira:

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

Se for um arquivo, você pode usar algo assim com base em suas necessidades:

$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

Verifique as propriedades BaseName e Extension do objeto FileInfo.


1
Você está atrás de alguma informação em particular? Basta enviar um arquivo para Get-Member para revelar todos os membros ou navegar até o MSDN para encontrar a ajuda oficial.
Shay Levy

7

Usar caminho dividido

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

2
Observe que isso só funcionará se não houver pontos no nome do arquivo.
Meio

2
você pode alterar para Split(".")[-1]para fazê-lo funcionar com arquivos com pontos no nome
phuclv

6

apenas faça:

$file=Get-Item "C:\temp\file.htm"
$file.Basename 
$file.Extension

1
Eu acho que deveria ser$file.Basename
john v kumpf

0

Esta é uma adaptação, se alguém estiver curioso. Eu precisava testar se o RoboCopy copiou com sucesso um arquivo para vários servidores quanto à sua integridade:

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

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

Agradável e simples, e mostra o diretório e o arquivo dentro dele. Se você quiser especificar um nome de arquivo ou extensão, basta substituir os * pelo que desejar.

    Directory: \\SERVER\Folder\Share

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

0

A partir do PowerShell 6.0, Split-Pathtem um -Extenstionparâmetro. Isso significa que você pode fazer:

$path | Split-Path -Extension

ou

Split-Path -Path $path -Extension

Para $path = "test.txt"ambas as versões vai voltar .txt, incluindo o ponto final.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.