Estoy tratando de cambiar el nombre de un montón de archivos recursivamente usando Powershell 2.0. La estructura de directorios se parece a esto:

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 el nombre de los archivos, pero se queja acerca de la subdirectorios:

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

Me vuelve a cargar los datos mensuales de usar robocopy, pero los directorios no cambian, así que puede cambiar el nombre a mano. Es allí cualquier manera de conseguir get-children para saltar los subdirectorios (como find Leaflets -type f ...)?

Gracias.

ACTUALIZACIÓN: parece que el problema es con los archivos que ya están en minúsculas. He intentado cambiar el comando:

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, función, etc.
Puedo canalizar la salida de get-childitem a un if declaración?

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() }
    }
}

OriginalEl autor Ralph | 2010-09-29

6 Comentarios

  1. 22

    Aunque ya ha publicado su propia respuesta, aquí es 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. -ne ignora las diferencias de caso.
    • $_ es cómo referencia al elemento actual en el ForEach-Object bucle.
    • ren es un alias para cambiar el nombre del Elemento de.
    • FullName es probablemente preferido, ya que asegura que va a estar tocando el archivo de la derecha.

    Si quería excluye a los directorios de ser cambiado de nombre, se podría incluir algo como:

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

    Espero que esto sea útil en la continuación de aprender y explorar PowerShell.

    OriginalEl autor Goyuix

  2. 11

    Tenga en cuenta que puede canalizar directamente a cambiar el nombre del Elemento y el uso Scriptblocks con laNewName parámetro (porque también acepta tubería de entrada) para simplificar esta tarea:

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

    y con los alias de:

    gci -r | ?{!$_.PSIsContainer} | rni -New {$_.FullName.ToLower()}
    Gracias. Y para cambiar los nombres de archivo podemos usar este : gci . -recurse -fuerza | ?{!$_.PSIsContainer} | rni -Nuevo {$_.Nombre.replace(«aaa»,»bbb»)}

    OriginalEl autor Keith Hill

  3. 2

    leve ajuste en esto, si usted sólo desea actualizar los nombres de los archivos de un determinado tipo de prueba esto:

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

    esto sólo minúsculas los archivos jpg en la carpeta e ignorar el resto

    OriginalEl autor ddools

  4. 1

    Usted necesita para cambiar temporalmente el nombre a algo más, a continuación, el nombre de ellos de nuevo todo 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
       }

    OriginalEl autor Derek Smalls

  5. 1

    Hay muchos problemas con la anterior, dado respuestas debido a la naturaleza de cómo Rename-Item, Tuberías, el Bucle y el sistema de Ficheros de Windows funciona. Por desgracia, la mayoría simple (no el uso de alias para mejorar la legibilidad aquí), solución que he encontrado para cambiar el nombre de todos los archivos y carpetas dentro de una carpeta determinada para bajar el caso es este:

    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)";}

    OriginalEl autor masi

  6. 0

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

    gci-Recurse Folletos | 
    ? { $_.Nombre -ne $_.Nombre.ToLower()) } | 
    % { s -NewName $_.Nombre.ToLower() } 
    

    OriginalEl autor Jay Bazuzi

Dejar respuesta

Please enter your comment!
Please enter your name here