powershell - extraer el nombre y la extensión del archivo

114

Necesito extraer el nombre del archivo y la extensión de, por ejemplo, my.file.xlsx. No sé el nombre del archivo o la extensión y puede haber más puntos en el nombre, por lo que necesito buscar la cadena desde la derecha y cuando encuentro el primer punto (o el último desde la izquierda), extraer la parte de la el lado derecho y la parte del lado izquierdo de ese punto.

Tal vez haya una mejor solución, pero no encontré nada aquí ni en ningún otro lugar. Gracias

culter
fuente
extraer de un archivo de texto o de qué?
CB.
Hola Christian, he actualizado mi pregunta. Necesito extraerlo del nombre del archivo. Gracias
culter

Respuestas:

174

Si el archivo está saliendo del disco y como otros han dicho, use las propiedades BaseNamey Extension:

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

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

Si se le da el nombre del archivo como parte de una cadena (digamos que proviene de un archivo de texto), usaría los métodos estáticos GetFileNameWithoutExtensiony GetExtensionde la clase 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
fuente
8
Para métodos más útiles en la clase System.IO.Path sin consultar la documentación de MSDN, puede usar[System.IO.Path] | Get-Member -Static
Phil
2
Tenga en cuenta que [System.IO.Path]::GetExtensiondevuelve la extensión que incluye el punto (".") .
Ohad Schneider
Gracias @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
fuente
13

Si es de un archivo de texto y se supone que el archivo de nombre está rodeado por espacios en blanco, esta es una forma:

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

Si es un archivo, puede usar algo como esto según sus necesidades:

$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.
fuente
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
fuente
8

Compruebe las propiedades BaseName y Extension del objeto FileInfo.

Shay Levy
fuente
1
¿Alguna información en particular que esté buscando? Simplemente envíe un archivo a Get-Member para revelar todos los miembros o navegue hasta MSDN para encontrar la ayuda oficial.
Shay Levy
7

Usar ruta dividida

$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
fuente
2
Tenga en cuenta que esto solo funcionará si no hay puntos en el nombre del archivo.
Halfdone
2
puede cambiar a Split(".")[-1]para que funcione con archivos con puntos en el nombre
phuclv
6

simplemente hazlo:

$file=Get-Item "C:\temp\file.htm"
$file.Basename 
$file.Extension
Esperento57
fuente
1
Creo que debería ser$file.Basename
john v kumpf
0

Esta es una adaptación, si alguien tiene curiosidad. Necesitaba probar si RoboCopy copió correctamente un archivo en varios servidores para comprobar su integridad:

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

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

Agradable y simple, y muestra el directorio y el archivo dentro de él. Si desea especificar un nombre de archivo o una extensión, simplemente reemplace los * con lo que desee.

    Directory: \\SERVER\Folder\Share

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

A partir de PowerShell 6.0, Split-Pathtiene un -Extenstionparámetro. Esto significa que puede hacer:

$path | Split-Path -Extension

o

Split-Path -Path $path -Extension

Para $path = "test.txt"ambas versiones volverá .txt, incluido el punto final.

Jacob Degeling
fuente