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
rendimientosfile
-
powershell.exe is good for me. Let me explain to thee..doc
rendimientospowershell
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]}