Tengo una serie de cadenas que son rutas de acceso a archivos. Me gustaría guardar sólo el nombre de archivo, sin la extensión del archivo y la principal ruta de acceso. Así que a partir de este:

c:\temp\myfile.txt

a

myfile

Yo no soy la iteración a través de un directorio, en el que caso de que algo como powershell basename propiedad podría ser utilizado, sino que estoy tratando con cadenas solo.

  • muchas de las respuestas no están tomando en cuenta a la segunda parte de la pregunta. Cuando Get-Item, Get-ChildItem, o su alias ls, dir, gi, gci se utilizan, el archivo de la prueba de la cadena de debe existir. Cuando estamos revisando una serie de la cadena y no la iteración a través de un directorio, se debe suponer que esos archivos no necesita existir en el equipo en el que este script se ejecute.
InformationsquelleAutor larryq | 2012-09-19

9 Comentarios

  1. 94

    Hay una mano .Método de RED para que:

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

    Manera más fácil de lo que pensaba abordar el tema de la visualización de la ruta de acceso completa, directorio, nombre de archivo o 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)
    • Sería bueno si al lado de cada ejemplo en la parte superior fragmento de código que mostraba exactamente lo que el texto sería devuelto.
    • No funcionará si $PSCommandPath no apunta a un archivo real.
    • Ejemplo donde no conozco a el .la rse de nombre de archivo, pero sé que existe un archivo: $csr = Get-ChildItem -Path "$($domain.FullName)/*.csr" luego Write-Host "fileName: $($csr.Basename)"
  3. 37

    Inspirado por un respuesta de @walid2mi:

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

    Por favor nota: esto sólo funciona si el archivo dado realmente existe.

    • Esta es la manera más fácil de nombre de archivo para un solo archivo.
    • Esto supone que el archivo existe. La eliminación de una extensión de un nombre de archivo no debería depender de eso. Lo que si está creando un archivo basado en un nombre de archivo que el archivo no existe? La ruta es una cadena de caracteres y debe ser tratado como una cadena, no se asume como un archivo existente.
  4. 27

    o

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

    o

    "c:\temp\myfile.txt".split('\.')[-2]
    • El segundo ejemplo no funciona demasiado bien con algo como – «C:\Downloads\ReSharperSetup.7.0.97.60.msi».split(‘\.’)[-2]
  5. 22

    puede utilizar basename propiedad

    PS II> ls *.ps1 | select basename
    • El OP dice: yo no soy la iteración a través de un directorio.
    • Muy útil para mí!
  6. 5

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

    Dado cualquier cadena de ruta de acceso, diferentes métodos estáticos en el Sistema.IO.Ruta de acceso del objeto de dar 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 
    

    Siguiente es el código que genera el resultado anterior.

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

    Escribir y probar el script que genera el anterior descubierto algunas peculiaridades acerca de cómo PowerShell difiere de C#, C, C++, Windows NT lenguaje de comandos, y todo lo demás con los que he tenido experiencia alguna.

  8. 0

    Esto se puede hacer mediante la división de la cadena un par de veces.

    #Path
    $Link = "http://some.url/some/path/file.name"
    
    #Split path on "/"
    #Results of split will look like this : 
    # http:
    #
    # some.url
    # some
    # path
    # file.name
    $Split = $Link.Split("/")
    
    #Count how many Split strings there are
    #There are 6 strings that have been split in my example
    $SplitCount = $Split.Count
    
    #Select the last string
    #Result of this selection : 
    # file.name
    $FilenameWithExtension = $Split[$SplitCount -1]
    
    #Split filename on "."
    #Result of this split : 
    # file
    # name
    $FilenameWithExtensionSplit = $FilenameWithExtension.Split(".")
    
    #Select the first half
    #Result of this selection : 
    # file
    $FilenameWithoutExtension = $FilenameWithExtensionSplit[0]
    
    #The filename without extension is in this variable now
    # file
    $FilenameWithoutExtension

    Aquí está el código sin comentarios :

    $Link = "http://some.url/some/path/file.name"
    $Split = $Link.Split("/")
    $SplitCount = $Split.Count
    $FilenameWithExtension = $Split[$SplitCount -1]
    $FilenameWithExtensionSplit = $FilenameWithExtension.Split(".")
    $FilenameWithoutExtension = $FilenameWithExtensionSplit[0]
    $FilenameWithoutExtension
    • ¿Por qué tan duro manera?
    • Sólo mostrar a la otra (fácil de leer) en el camino, eso es todo.

Dejar respuesta

Please enter your comment!
Please enter your name here