2012-09-19 19 views
52

Tengo una serie de cadenas que son rutas completas a los archivos. Me gustaría guardar solo el nombre de archivo, sin la extensión de archivo y la ruta principal. Así que de esto:Eliminación de ruta y extensión del nombre de archivo en powershell

c:\temp\myfile.txt 

a

myfile 

No estoy realmente iteración a través de un directorio, en el que algo caso como la propiedad de PowerShell basename podría ser utilizado, sino que estoy tratando con cadenas solas .

+1

muchas respuestas no están tomando en cuenta la segunda parte de la pregunta. Cuando se utilizan Get-Item, Get-ChildItem o sus alias ls, dir, gi, gci, el archivo de la cadena probada ** debe existir **. Cuando estamos comprobando una serie de cadenas y no escribiendo a través de un directorio, se debe suponer que esos archivos no necesitan existir en la computadora donde se ejecutará este script. – papo

Respuesta

65

Hay un método práctico para .NET que:

C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt") 
myfile 
17

puede utilizar nombre base propiedad

PS II> ls *.ps1 | select basename 
+5

El OP dice: en realidad no estoy iterando a través de un directorio. –

+0

¡Muy útil para mí! – JMS10

21

o

([io.fileinfo]"c:\temp\myfile.txt").basename 

o

"c:\temp\myfile.txt".split('\.')[-2] 
+5

El segundo ejemplo no funciona demasiado bien con algo como "C: \ Descargas \ ReSharperSetup.7.0.97.60.msi" .split ('\.') [- 2] –

3

@Keith,

aquí otra opción:

PS II> $f="C:\Downloads\ReSharperSetup.7.0.97.60.msi" 

PS II> $f.split('\')[-1] -replace '\.\w+$' 

PS II> $f.Substring(0,$f.LastIndexOf('.')).split('\')[-1] 
17

Inspirado por un answer de @ walid2mi:

(Get-Item 'c:\temp\myfile.txt').Basename 

Aunque debe tenerse en cuenta, que esto sólo funciona si el dado archivo realmente existe.

+0

Esta es la forma más fácil de obtener el nombre del archivo para un solo archivo. – marisks

1

Aquí está uno sin paréntesis

[io.fileinfo] 'c:\temp\myfile.txt' | % basename 
32

manera más fácil de lo que pensaba para abordar la cuestión de mostrar la ruta completa, directorio, nombre de archivo o extensión de archivo. otros

$PSCommandPath 
(Get-Item $PSCommandPath).Extension 
(Get-Item $PSCommandPath).Basename 
(Get-Item $PSCommandPath).Name 
(Get-Item $PSCommandPath).DirectoryName 
(Get-Item $PSCommandPath).FullName 
$ConfigINI = (Get-Item $PSCommandPath).DirectoryName+"\"+(Get-Item $PSCommandPath).BaseName+".ini" 
$ConfigINI 

formas:

$scriptPath = split-path -parent $MyInvocationMyCommand.Definition 
split-path -parent $PSCommandPath 
Split-Path $script:MyInvocation.MyCommand.Path 
split-path -parent $MyInvocation.MyCommand.Definition 
[io.path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Name) 
+1

Esto debe publicarse en inglés. Intenta traducirlo si es posible –

+0

Traducido al inglés – Leonardo

+0

¡Genial! Espero que no mucha gente intente apagarlo –

Cuestiones relacionadas