我正在尝试编写一个脚本,查找包含单词“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}
非常感谢
答案 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)