2012-07-06 19 views
7

estoy usando PowerShell en Windows XP y estoy tratando de escribir un comando que:Powershell: Reemplazar cadena de forma recursiva en seleccionar a los sub-archivos de un directorio

1. read all .bat,.cfg, and .config files 
2. replace a string (it's actually the path...these files were all moved) 
3. overwrite the existing files with the new one (same name, same location, etc.) 

no soy un usuario Powershell, pero han logrado fragmentar el siguiente conjunto:

gci -r -include "*.bat","*.config","*.cfg" 
    | gc 
    | foreach { $_ -replace "D:","C:\path" } 
    | sc ??.FullName 

estoy bastante seguro de que me he encargado de # 1 y # 2, pero estoy teniendo problemas para averiguar # 3 (pasando el nombre del archivo a la variable que puede ser referenciado en sc). ¿Alguna idea? Además, avíseme si necesita información adicional.

EDIT:

me las arreglé para trabajar a cabo una respuesta (véase más adelante), pero hay una mejor manera de hacer esto?

Respuesta

9

intento:

gci -r -include "*.bat","*.config","*.cfg" | 
foreach-object { $a = $_.fullname; (get-content $a) | 
foreach-object { $_ -replace "D:","C:\path" } | 
set-content $a } 
+0

Gracias! Funciona, aunque te perdiste un soporte después de "C: \ path". –

+0

@DavidC ¡Sip! ¡suelto formateando mi respuesta! ¡Ahora está arreglado! –

0

Reconocí que necesitaba una variable adicional. Una forma de hacerlo es integrando un for-loop en la parte exterior del comando. Solía:

foreach ($f in gci -r -include "*.bat") 
    { (gc $f.fullname) | 
     foreach { $_ -replace "D:","C:\path" } | 
     sc $f.fullname 
    } 
Cuestiones relacionadas