with multiple movefile files batch powershell rename recursive-descent

multiple - Renombra archivos a minúsculas en Powershell



rename multiple files (6)

Estoy tratando de renombrar un montón de archivos de forma recursiva utilizando Powershell 2.0. La estructura del directorio se ve así:

Leaflets + HTML - File1 - File2 ... + HTMLICONS + IMAGES - Image1 - Image2 - File1 - File2 ... + RTF - File1 - File2 ... + SGML - File1 - File2 ...

Estoy usando el siguiente comando:

get-childitem Leaflets -recurse | rename -newname { $_.name.ToLower() }

y parece que cambia el nombre de los archivos, pero se queja de los subdirectorios:

Rename-Item : Source and destination path must be different.

Recargo los datos mensualmente con robocopy, pero los directorios no cambian, por lo que puedo cambiarles el nombre manualmente. ¿Hay alguna forma de que get-children omita los subdirectorios (como find Leaflets -type f ... )?

Gracias.

ACTUALIZACIÓN: Parece que el problema es con archivos que ya están en minúsculas. Intenté cambiar el comando para:

get-childitem Leaflets -recurse | if ($_.name -ne $_name.ToLower()) rename -newname { $_.name.ToLower() }

pero ahora Powershell se queja de que if no es un cmdlet, una función, etc. ¿Puedo canalizar la salida de get-childitem a una sentencia if ?

ACTUALIZACIÓN 2 : Esto funciona:

$files=get-childitem Leaflets -recurse foreach ($file in $files) { if ($file.name -ne $file.name.ToLower()) { rename -newname { $_.name.ToLower() } } }


Aunque ya hayas publicado tu propia respuesta, aquí hay una variación:

dir Leaflets -r | % { if ($_.Name -cne $_.Name.ToLower()) { ren $_.FullName $_.Name.ToLower() } }

Algunos puntos:

  • dir es un alias para Get-ChildItem (y -r es la abreviatura de -Recurse).
  • % es un alias para ForEach-Object .
  • -Cne es una comparación entre mayúsculas y minúsculas. -no ignora las diferencias de casos.
  • $ _ es cómo hace referencia al elemento actual en el bucle ForEach-Object.
  • ren es un alias para Rename-Item .
  • Probablemente se prefiera FullName ya que asegura que tocará el archivo correcto.

Si desea excluir el cambio de nombre de los directorios, puede incluir algo como:

if ((! $_.IsPsContainer) -and $_.Name -cne $_.Name.ToLower()) { ... }

Esperemos que esto sea útil para continuar aprendiendo y explorando PowerShell.


Debe cambiarlos temporalmente a otra cosa y luego volver a nombrarlos en minúsculas.

$items = get-childitem -Directory -Recurse foreach ($item in $items) { if ($item.name -eq $item.name.ToLower()) { $temp = $item.FullName.ToLower() + "_" $name = $item.FullName.ToLower() ren $name $temp ren $temp $name }


Es más idomático en PowerShell usar where lugar de if en una tubería:

gci -Recurse Leaflets | ? { $_.Name -ne $_.Name.ToLower()) } | % { ren -NewName $_.Name.ToLower() }


Hay muchos problemas con las respuestas anteriores debido a la naturaleza de cómo funcionan Rename-Item , Piping, Looping y el sistema de archivos de Windows. Desafortunadamente, la solución más simple (que no usa alias para facilitar la lectura aquí) que encontré para cambiar el nombre de todos los archivos y carpetas dentro de una carpeta dada a minúscula es la siguiente:

Get-ChildItem -Path "/Path/To/You/Folder" -Recurse | Where{ $_.Name -cne $_.Name.ToLower() } | ForEach-Object { $tn="$($_.Name)-temp"; $tfn="$($_.FullName)-temp"; $nn=$_.Name.ToLower(); Rename-Item -Path $_.FullName -NewName $tn; Rename-Item -Path $tfn -NewName $nn -Force; Write-Host "New Name: $($nn)";}


Tenga en cuenta que puede canalizar directamente a Rename-Item y usar Scriptblocks con el parámetro - NewName (porque también acepta entradas de canalización) para simplificar esta tarea:

Get-ChildItem -r | Where {!$_.PSIsContainer} | Rename-Item -NewName {$_.FullName.ToLower()}

y con alias:

gci -r | ?{!$_.PSIsContainer} | rni -New {$_.FullName.ToLower()}


leve modificación en esto, si solo deseas actualizar los nombres de archivos de un tipo en particular, prueba esto:

get-childitem *.jpg | foreach { if ($_.Name -cne $_.Name.ToLower()) { ren $_.FullName $_.Name.ToLower() } }

esto solo minúscula los archivos jpg dentro de su carpeta e ignorará el resto