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


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

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

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

9
PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type')
PS C:\Users\joshua> $file.BaseName, $file.Extension
file
.type

8

Compruebe las propiedades BaseName y Extension del objeto FileInfo.


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];

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

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                                                                                                             

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.