2013-09-05 4 views
2

주어진 디렉토리 아래의 모든 파일과 폴더를 조사하여 .properties 파일의 주어진 단어의 모든 인스턴스를 인스턴스로 변경하는 PowerShell 스크립트를 만들려고합니다. 다른 주어진 단어의.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 - 재발')? – Richard

관련 문제