2015-11-11 2 views
2

У меня есть следующий сценарий, который я пытаюсь работать на различных HTML-файлов-replace REGEX PowerShell

$files = $args[0]; 
$string1 = $args[1]; 
$string2 = $args[2]; 
Write-Host "Replace $string1 with $string2 in $files"; 
gci -r -include "$files" | 
foreach-object { $a = $_.fullname; (get-content $a) | 
    foreach-object { 
      $_ -replace "%string1" , "$string2" | 
      set-content $a 
    } 
} 

в попытке отредактировать эту строку найденную во всех файлах.

<tr><td><a href="sampleTest.html">TestCase</a></td></tr> 

Я называю сценарий с помощью PowerShell, как это (это называется replace.ps1)

./replace *.html sampleTest myNewTest 

но вместо изменения sampleTest.html к myNewTest.html удаляет все в док за исключением последняя линия, оставив все файлы, как так:

/html 

на самом деле, независимо от того, какие аргументы я прохожу в этом, кажется, произошло. Может ли кто-нибудь объяснить это/помочь мне понять, почему это происходит?

ответ

3

Здесь виновата ваша структура петли. Вы должны иметь Set-Content, расположенный за пределами цикла. Ваш код перезаписывает файл на каждом проходе.

.... 
foreach-object { $a = $_.fullname; (get-content $a) | 
    foreach-object { 
      $_ -replace "$string1" , "$string2" |   
    } | set-content $a 
} 

Это также могло бы быть опечатка, но вы имели "%string1", перед которым, в то время как синтаксически правильно, что не то, что вы хотели.

Может также использовать Add-Content, но это означало бы, что вы должны сначала стереть файл. set-content $a, используемый в конце трубы, более интуитивно понятен.


В вашем примере используется не регулярное выражение. Вы могли бы использовать $_.replace($string1,$string2) с теми же результатами.