Extraiga el nombre de archivo de una ruta

83

Quiero extraer el nombre de archivo de la ruta de abajo:

D: \ Server \ User \ CUST \ MEA \ Data \ In \ Files \ CORRECTED \ CUST_MEAFile.csv

Ahora escribí este código para obtener el nombre del archivo. Esto funciona bien siempre que el nivel de la carpeta no haya cambiado. Pero en caso de que se haya cambiado el nivel de la carpeta, este código debe reescribirse. Estoy buscando una manera de hacerlo más flexible, ya que el código siempre puede extraer el nombre del archivo independientemente del nivel de la carpeta.

($outputFile).split('\')[9].substring(0)
usuario664481
fuente

Respuestas:

164

Si está de acuerdo con incluir la extensión, esto debería hacer lo que quiera.

$outputPath = "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
$outputFile = Split-Path $outputPath -leaf
Gordon
fuente
6
Esta es una respuesta genial. Resuelve el problema de la forma más "incorporada". Sin embargo, para mis necesidades, necesitaba tanto el nombre de archivo con extensión como el nombre de archivo base, así que usé la respuesta de @ angularsen. Hay otro parámetro, -leafbase, pero solo es compatible con PowerShell Core 6+.
Jamie
62

Utilizar :

[System.IO.Path]::GetFileName("c:\foo.txt")devuelve foo.txt. [System.IO.Path]::GetFileNameWithoutExtension("c:\foo.txt")devolucionesfoo

angularsen
fuente
16

El uso de BaseName en Get-ChildItem muestra el nombre del archivo y el uso de Name muestra el nombre del archivo con la extensión.

$filepath = Get-ChildItem "E:\Test\Basic-English-Grammar-1.pdf"

$filepath.BaseName

Basic-English-Grammar-1

$filepath.Name

Basic-English-Grammar-1.pdf
Sudhir Tharayil
fuente
4

Podría obtener el resultado que desea de esta manera.

$file = "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
$a = $file.Split("\")
$index = $a.count - 1
$a.GetValue($index)

Si usa "Get-ChildItem" para obtener el "nombre completo", también puede usar "nombre" para obtener simplemente el nombre del archivo.

David
fuente
6
Simplemente use el índice -1si está adoptando el enfoque de matriz:$file.Split("\")[-1]
Ansgar Wiechers
Si queremos eliminar la extensión, ¿qué podemos hacer?
Souradeep Banerjee-AIS
4
Get-ChildItem "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
|Select-Object -ExpandProperty Name
Ian Kemp
fuente
3

Solo para completar la respuesta anterior, use .Net.

En este código, la ruta se almacena en el %1argumento (que está escrito en el registro bajo comillas que se escapan :) \"%1\". Para recuperarlo, necesitamos el $arg(arg incorporado). No olvide la cita $FilePath.

# Get the File path:  
$FilePath = $args
Write-Host "FilePath: " $FilePath

# Get the complete file name:
$file_name_complete = [System.IO.Path]::GetFileName("$FilePath")
Write-Host "fileNameFull :" $file_name_complete

# Get File Name Without Extension:
$fileNameOnly = [System.IO.Path]::GetFileNameWithoutExtension("$FilePath")
Write-Host "fileNameOnly :" $fileNameOnly

# Get the Extension:
$fileExtensionOnly = [System.IO.Path]::GetExtension("$FilePath")
Write-Host "fileExtensionOnly :" $fileExtensionOnly
J. Hace
fuente
3
$(Split-Path "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv" -leaf)
Iain
fuente
3

Puedes probar esto:

[System.IO.FileInfo]$path = "D:\Server\User\CUST\MEA\Data\In\Files\CORRECTED\CUST_MEAFile.csv"
# Returns name and extension
$path.Name
# Returns just name
$path.BaseName
Wasif Hasan
fuente
2

Busque un archivo usando comodines y obteniendo el nombre del archivo:

Resolve-Path "Package.1.0.191.*.zip" | Split-Path -leaf
Luis Hernandez
fuente
1
$file = Get-Item -Path "c:/foo/foobar.txt"
$file.Name

Funciona con rutas relativas y absolutas

ravisilva
fuente