2011-08-24 18 views
7

Llamar a este comando de powershell y obtener un error. Me vuelve loco.Cambiar el nombre de los archivos recursivamente en Powershell

Prompt> get-childitem -recurse ./ *NYCSCA* | where-object { $_.Name -like 
"*NYCSCA*" } | rename-item $_ -newname $_.Name.Replace(" ","_") -whatif 

Aquí está la respuesta:

You cannot call a method on a null-valued expression. 
At line:1 char:140 
+ get-childitem -recurse ./ *NYCSCA* | where-object { $_.Name -like "*NYCSCA*" } | select FullName | rename-item $_ -n 
ewname $_.Name.Replace <<<< (" ","_") -whatif 
    + CategoryInfo   : InvalidOperation: (Replace:String) [], RuntimeException 
    + FullyQualifiedErrorId : InvokeMethodOnNull 

Si quito la última parte, me sale una lista de archivos. ¿Alguna pista? No he agotado powershell aún, obviamente.

Nota: traté de publicar esto en superusuario, pero el sitio está fracasando constantemente, no me deja agregar esta pregunta exacta.

Aquí está muy simplificado. Ni siquiera puedo hacer funcionar este clásico ejemplo.

gci *NYCSCA* | ren $_ ($_.Name).Replace("foo","bar") 

Gracias @JNK, el% lo hizo. La solución es que necesitaba esto, en caso de que esté interesado:

gci -recurse | where-object{ $_.Name -like "*NYCSCA*"} | %{rename-item $_.FullName $_.FullName.Replace("NYCSCA","SDUSD") } 
+0

ver http://stackoverflow.com/a/21614001/8479 – Rory

Respuesta

7

creo que es necesario foreach a objetos:

get-childitem -recurse ./ *NYCSCA* | where-object { $_.Name -like 
"*NYCSCA*" } | % {rename-item $_ -newname $_.Name.Replace(" ","_") -whatif} 

La matriz hilo no se puede renombrar como un conjunto.

+0

nop mismos error. Agregué una versión simplificada arriba. –

+0

@Daniel - pruebe la nueva respuesta – JNK

+0

¡Sí! Eso es todo, gracias. Necesito entender conjuntos contra artículos mejor. ¡Pero esto es genial! –

5

Aquí hay una versión simplificada para renombrar archivos sólo

Get-ChildItem -Filter *NYCSCA* -Recurse | 
Where-Object {!$_.PSIsContainer} | 
Rename-Item -NewName { $_.Name.Replace(' ','_') } -WhatIf 

(Editar: saltos de línea para mayor claridad añaden)

+1

La verdadera diferencia aquí es usar los bloques de código '{...}' en los argumentos 'rename-item' para permitir la referencia a' $ _' (razón por la cual 'foreach-object' también proporciona una solución. – Richard

+0

True, foreach- objeto hace el trabajo pero agrega sobrecarga (y es más lento). –

+0

Interesante, por lo que permite que el elemento rename trate sus argumentos como un conjunto, en lugar de tener que renombrar elementos invocados dentro de un conjunto de operaciones de foreach. –

Cuestiones relacionadas