9

特定のディレクトリの下にあるすべてのファイルとフォルダーを調べて、.properties ファイル内の特定の単語のすべてのインスタンスを別の特定の単語のインスタンスに変更する powershell スクリプトを作成しようとしています。

以下に書いたことはこれを行いますが、私のバージョン管理は、変更する単語のインスタンスが含まれているかどうかに関係なく、すべてのファイルの変更に気づきます。これに対抗するために、コンテンツを取得/設定する前に、単語がファイルに存在するかどうかを確認するチェックを入れようとしましたが (以下を参照)、[System.Object[]] に含まれていないことがわかります。 「Contains」という名前のメソッド。これは $_ が配列であることを意味していると想定したので、ループを作成してループを作成し、一度に各ファイルをチェックしようとしましたが、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
}



}

ありがとうございました!

4

3 に答える 3

17

これを試して:

$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は実行されます。

于 2013-09-05T10:37:23.600 に答える
4

簡略化された contains 句

$file = Get-Content $_.FullName

if ((Get-Content $file | %{$_ -match $wordToFind}) -contains $true) {
    Add-Content log.txt $_.FullName
    ($file) | ForEach-Object { $_ -replace $wordToFind , $wordToReplace } | 
    Set-Content $_.FullName
}
于 2018-03-26T11:37:15.757 に答える
-1

ファイルに単語が含まれていることを確認する最も簡単な方法

Get-Content結果を見ると、文字列 System.Arrayが見つかります。したがって、.NET の System.Linq で次のようにすることができます。

content.Any(s => s.Contains(wordToFind));

PowerShell では次のようになります。

Get-Content $filePath `
            | %{ $res = $false } `
               { $res = $res -or $_.Contains($wordToFind) } `
               { return $res }

その結果、ファイルパスのパラメーターと単語を含むコマンドレットに集約して使用できます。もう 1 つ:-matchの代わりに で正規表現を使用できるContainsため、より柔軟になります。

于 2019-02-05T15:26:13.493 に答える