Powershell,使用contains来检查文件是否包含某个单词

时间:2013-09-05 10:17:21

标签: powershell

我正在尝试创建一个powershell脚本,该脚本查看给定目录下的所有文件和文件夹,然后将.properties文件中给定单词的所有实例更改为另一个给定单词的实例。

我在下面写的内容确实如此,但是我的版本控制注意到每个文件中的更改,无论它是否包含要更改的单词的实例。为了解决这个问题,我尝试在获取/设置内容之前检查文件中是否存在该单词(如下所示)但是它告诉我[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
}



}

谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

简化包含子句

my ($package, $filename, $line, $subroutine) = caller(1);
my $success = $sub->(@_) or die "sub returned false value at ".
    "$filename line $line in sub $subroutine in package $package";

答案 2 :(得分:0)

检查文件中是否包含单词的最简单方法

如果我们查看-Dfreenect2_DIR= path_to_freenect2/lib/cmake/freenect2结果,则会找到 string System.Array 。因此,我们可以在.NET的System.Linq中做到这一点:

Get-Content

在PowerShell中,它看起来像:

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

因此,我们可以将其与包含文件路径的参数并包含word的cmdlet聚合在一起并使用它。还有一个:我们可以将Regex与Get-Content $filePath ` | %{ $res = $false } ` { $res = $res -or $_.Contains($wordToFind) } ` { return $res } 一起使用,而不是-match,因此它将更加灵活。