Saltar al contenido

Salida de archivo en Powershell sin extensión

Solución:

Get-ChildItem "C:Folder" | Select BaseName > C:FolderFile.txt

Pase el nombre del archivo al GetFileNameWithoutExtension método para eliminar la extensión:

Get-ChildItem "C:Folder" | `
    ForEach-Object { [System.IO.Path]::GetFileNameWithoutExtension($_.Name) } `
    > C:FolderFile.txt

Quería comentar sobre la respuesta de @ MatthewMartin, que divide el nombre del archivo entrante en el . carácter y devuelve el primer elemento de la matriz resultante. Esto funcionará para nombres con cero o uno. ., pero produce resultados incorrectos para cualquier otra cosa:

  • file.ext1.ext2 rendimientos file
  • powershell.exe is good for me. Let me explain to thee..doc rendimientos powershell

La razón es porque está devolviendo todo antes del primero . cuando realmente debería ser todo antes de la último .. Para solucionar esto, una vez que tengamos el nombre dividido en segmentos separados por ., tomamos todos los segmentos excepto el último y los volvemos a unir separados por .. En el caso de que el nombre no contenga un . devolvemos el nombre completo.

ForEach-Object {
    $segments = $_.Name.Split('.')

    if ($segments.Length -gt 1) {
        $segmentsExceptLast = $segments | Select-Object -First ($segments.Length - 1)

        return $segmentsExceptLast -join '.'
    } else {
        return $_.Name
    }
}

Un enfoque más eficiente sería caminar hacia atrás a través del nombre carácter por carácter. Si el personaje actual es un ., devuelve el nombre hasta el carácter actual, pero sin incluirlo. Si no . se encuentra, devuelve el nombre completo.

ForEach-Object {
    $name = $_.Name;

    for ($i = $name.Length - 1; $i -ge 0; $i--) {
        if ($name[$i] -eq '.') {
            return $name.Substring(0, $i)
        }
    }

    return $name
}

los [String] class ya proporciona un método para hacer lo mismo, por lo que lo anterior se puede reducir a …

ForEach-Object {
    $i = $_.Name.LastIndexOf([Char] '.');

    if ($i -lt 0) {
        return $_.Name
    } else {
        return $_.Name.Substring(0, $i)
    }
}

Los tres enfoques funcionarán para nombres con cero, uno o múltiples . personajes, pero, por supuesto, también son mucho más detallados que las otras respuestas. De hecho, LastIndexOf() qué es GetFileNameWithoutExtension() utiliza internamente, mientras que BaseName usa es funcionalmente lo mismo que llamar $_.Name.Substring() excepto que aprovecha la extensión ya calculada.

Y ahora para una versión de FileInfo, ya que todos los demás me ganaron con una solución Path.GetFileNameWithoutExtension.

Get-ChildItem "C:" | `
where { ! $_.PSIsContainer } | `
Foreach-Object {([System.IO.FileInfo]($_.Name)).Name.Split('.')[0]}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *