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