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.