2012-07-06 8 views
7

Używam PowerShell w systemie Windows XP i próbuję napisać polecenie, które będzie:PowerShell: Rekursywnie Wymień String w wybranych Subfunduszy pliki z katalogu

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.) 

Nie jestem użytkownikiem PowerShell, ale udało się rozbijać następujące razem:

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

Jestem prawie pewna, że ​​mam pod opieką # 1 i # 2, ale mam problemy z zastanawianie się, nr 3 (przekazując nazwę pliku do zmiennej, która może być wymieniony w sc). jakieś pomysły? Daj mi też znać, jeśli potrzebujesz dodatkowych informacji.

EDIT:

udało mi się wypracować odpowiedź (patrz niżej), ale czy istnieje lepszy sposób to zrobić?

Odpowiedz

9

try:

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

Dzięki! Działa, chociaż brakowało ci nawiasu po "C: \ path". –

+0

@DavidC Tak! tracę to formatowanie mojej odpowiedzi! Teraz jest naprawiony! –

0

Uznałem, że potrzebuję dodatkowej zmiennej. Jednym ze sposobów jest zintegrowanie pętli for w zewnętrznej części polecenia. Użyłem:

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