Powershell,查找包含关键字的文件,然后重命名这些文件

时间:2014-11-17 09:42:42

标签: powershell

我正在尝试编写一个脚本,查找包含单词“Datamonitor”的目录中的所有文件,并使用带有前缀“Datamonitor”的现有名称重命名文件。

我尝试使用SelectString cmdlet,但这似乎不适合我。我找到了一些可能被修改的代码,但我一直无法解决问题。

$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
}
}

是否有人能够帮我修改此搜索我的关键字并添加Rename-Item -Newmane {"Datamonitor_""+$_.Name}

非常感谢

2 个答案:

答案 0 :(得分:1)

以下内容将查找所有* .properties文件,如果它们包含关键字' DataMonitor'该文件将被重命名。

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

    $i = Get-Content $_ |Select-String "Datamonitor" -SimpleMatch

    if ($i -ne $null)
    {
        Rename-Item $_ -NewName ('Datamonitor_'+$_.name)
    }
}
然而,一个缺点是,这只能运行一次。多次运行会增加额外的数据监控器_'到文件名。这可以很容易地修复。

PS。在您的问题中,您要求所有文件,然后在get-childitem中指定过滤器。我使用过滤器来满足本例的需要,如果你想要所有文件,只需删除-filter * .properties

答案 1 :(得分:0)

$file | %{$_ -match $wordToFind}

检查文件名称$wordToFind的匹配项,而不是文件内容。对于后者,你需要像

这样的东西
$file | ? { (Get-Content $_) -pattern $wordToFind }

或(更好)

$file | ? { Select-String -LiteralPath $_ -Pattern $wordToFind }

请注意,两种方式都使用正则表达式匹配,因此如果$wordToFind包含特殊字符,则需要正确转义它们:

[regex]::Escape($wordToFind)