2011-12-15 13 views
5

Quiero reemplazar todos los caracteres de espacio en "_" en los nombres de todas las subcarpetas y archivos. Desafortunadamente cuando escribo: Mensaje dereemplazar nombres de todas las directiories y archivos en PS

Get-ChildItem -recurse -name | ForEach-Object { Rename-Item $_ $_.replace(" ","_") } 

error:

Rename-Item : Source and destination path must be different. At line:1 char:60 + Get-ChildItem -recurse -name | ForEach-Object { Rename-Item <<<< $_ $.replace(" ","") } + CategoryInfo : WriteError: (PATH_HERE) [Rename-Item], IOException + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

cómo debería mejorar este código corto?

Respuesta

5

El problema aquí es que si no hay espacio en el nombre del archivo, el nombre no cambia. Esto no es compatible con Rename-Item. Debe utilizar Move-Item lugar:

Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace(" ", "_") } 

Además, en su respuesta se ha perdido el carácter de subrayado en $_.replace(...) además de que en sustitución de espacios con una cadena vacía. Incluido esto en mi respuesta.

+1

Elemento mover: El proceso no puede acceder al archivo porque lo está utilizando otro proceso. En línea: 1 caracteres: 58 + Get-ChildItem -recurse -name | ForEach-Object {Move-Item <<<< $ _ $ _. Replace ("", "_")} + CategoryInfo: WriteError: – matandked

5

No use el interruptor Nombre, solo muestra los nombres de los objetos, no su ruta completa. Pruebe esto:

Get-ChildItem -Recurse | ` 
    Where-Object {$_.Name -match ' '} | ` 
    Rename-Item -NewName { $_.Name -replace ' ','_' } 
+0

Nice. Es posible que desee incluir Where-Object {$ _. Attributes -notmatch 'Directory'} como un filtro adicional. No puede cambiar el nombre de un directorio mientras lo itera. –

+1

@MichaelBlackburn Otro truco es ordenar la colección por el FullName en orden descendente. Esto fuerza al script a manejar todos los elementos secundarios en un directorio antes de modificar el directorio. –

Cuestiones relacionadas