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

culter
fonte
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
Goyuix
fonte
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
Straff
fonte
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
CB.
fonte
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
fonte
8

Verifique as propriedades BaseName e Extension do objeto FileInfo.

Shay Levy
fonte
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];
Ernest Correale
fonte
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
Esperento57
fonte
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                                                                                                             
Hans57sauc
fonte
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.

Jacob Degeling
fonte