varios txt renombrar por parte nombre masivamente lotes listar extension crear con carpeta cambiar archivos archivo file powershell directory

file - txt - Eliminando la ruta y la extensión del nombre del archivo en powershell



renombrar archivos masivamente powershell (8)

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. Entonces a partir de esto:

c:/temp/myfile.txt

a

myfile

En realidad, no estoy iterando a través de un directorio, en cuyo caso podría usarse algo así como la propiedad del basename de basename de powershell, sino que estoy tratando con cadenas solo.


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


Aquí hay uno sin paréntesis

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


Dada una cadena de ruta arbitraria, varios métodos estáticos en el objeto System.IO.Path dan los siguientes resultados.

strTestPath = C: / Users / DAG / Documents / Articles_2018 / NTFS_File_Times_in_CMD / PathStringInfo.ps1

GetDirectoryName = C: / Users / DAG / Documents / Articles_2018 / NTFS_File_Times_in_CMD GetFileName = PathStringInfo.ps1 GetExtension
= .ps1 GetFileNameWithoutExtension = PathStringInfo

A continuación está el código que generó el resultado anterior.

[consola] :: Writeline ("strTestPath = {0} {1}", $ strTestPath, [Environment] :: NewLine); [consola] :: Writeline ("GetDirectoryName = {0}", [IO.Path] :: GetDirectoryName ($ strTestPath)); [consola] :: Writeline ("GetFileName = {0}", [IO.Path] :: GetFileName ($ strTestPath)); [consola] :: Writeline ("GetExtension = {0}", [IO.Path] :: GetExtension ($ strTestPath)); [consola] :: Writeline ("GetFileNameWithoutExtension = {0}", [IO.Path] :: GetFileNameWithoutExtension ($ strTestPath));

Escribir y probar la secuencia de comandos que generó lo anterior descubrió algunas peculiaridades sobre cómo PowerShell difiere de C #, C, C ++, el lenguaje de comandos de comandos de Windows NT, y casi todo lo demás con el que tengo alguna experiencia.


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

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


Inspirado por una answer de @ walid2mi:

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

Aunque debe tenerse en cuenta, esto solo funciona si el archivo dado realmente existe.


Mucho más fácil de lo que pensé para abordar el problema de mostrar la ruta completa, el directorio, el nombre de archivo o la extensión de archivo.

$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

otras 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)


o

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

o

"c:/temp/myfile.txt".split(''/.'')[-2]


puedes usar propiedad de nombre de usuario

PS II> ls *.ps1 | select basename