2013-09-05 7 views
2

Я пытаюсь создать сценарий powershell, который просматривает все файлы и папки в заданном каталоге, а затем изменяет все экземпляры заданного слова в файлах .properties экземпляру другого данного слова.Powershell, используя содержит, чтобы проверить, содержат ли файлы определенное слово

То, что я написал ниже, делает это, однако мой контроль версий замечает изменение в каждом отдельном файле независимо от того, содержит ли он экземпляр слова для изменения. Чтобы противостоять этому, я попытался проверить, присутствует ли слово или нет в файле, прежде чем я получу/настрою содержимое (показано ниже), однако он сообщает мне, что [System.Object []] не содержит метод «Содержит». Я предположил, что это означает, что $ _ был массивом, поэтому я попытался создать цикл, чтобы пройти через него, и проверить каждый файл за раз, но он сказал мне, что это невозможно индексировать в объект типа System.IO.FileInfo.

Может ли кто-нибудь рассказать мне, как я могу изменить приведенный ниже код, чтобы проверить, содержит ли когда-либо файл wordToChange, а затем применить изменение, которое он делает.

$directoryToTarget=$args[0] 
$wordToFind=$args[1] 
$wordToReplace=$args[2] 

Clear-Content log.txt 

Get-ChildItem -Path $directoryToTarget -Filter *.properties -Recurse | where { !$_.PSIsContainer } | % { 


If((Get-Content $_.FullName).Contains($wordToFind)) 
{ 
    Add-Content log.txt $_.FullName 
    (Get-Content $_.FullName) | 
    ForEach-Object { $_ -replace $wordToFind , $wordToReplace } | 
    Set-Content $_.FullName 
} 



} 

Спасибо!

+0

Обратите внимание, что вы загружаете файл дважды, рассматриваете загрузку в переменную и выполняете -contains и -replace против переменной, может немного ускориться ... –

ответ

12

Попробуйте это:

$directoryToTarget=$args[0] 
$wordToFind=$args[1] 
$wordToReplace=$args[2] 

Clear-Content log.txt 

Get-ChildItem -Path $directoryToTarget -Filter *.properties -Recurse | where { !$_.PSIsContainer } | % { 

$file = Get-Content $_.FullName 
$containsWord = $file | %{$_ -match $wordToFind} 
If($containsWord -contains $true) 
{ 
    Add-Content log.txt $_.FullName 
    ($file) | ForEach-Object { $_ -replace $wordToFind , $wordToReplace } | 
    Set-Content $_.FullName 
} 

} 

Это поместит содержимое файла в массив $file затем проверить каждую строку на слова. Результат каждой строки ($true/$false) помещается в массив $containsWord. Затем массив проверяет, найдено ли это слово ($True переменная присутствует); если да, то выполняется if loop.

+1

Это потрясающе спасибо. На боковой ноте вы можете подумать о причине, почему фильтр .properties не будет полностью работать. Он по-прежнему ищет файлы .sh, даже если он не вносит никаких изменений. –

+0

Итак, вы просто ищете файлы с exstention '.properties'? Если так, чтобы фильтр работал нормально ... Вы получаете ожидаемые файлы, перечисленные при вводе 'Get-ChildItem' самостоятельно в оболочку PowerShell (' Get-ChildItem -Path $ directoryToTarget -Filter * .properties - Recurse')? – Richard

Смежные вопросы