我试图在日志目录中搜索文本文件内容,以匹配另一个目录中存在的文件名。
我知道我可以做Get-ChildItem $Path -file -name
并返回一个列表。我也知道如何执行Get-Content ... | Select-String -Pattern
但是,我不知道如何将文件列表提供给-Pattern
。
我没有成功尝试过:
# Delete all Files in C:\Data\Uploads older than 90 day(s)
$Path = "C:\the_path"
$LogPath = "C:\logs"
Get-Content $LogPath + "\*.log" | Select-String -Pattern (Get-ChildItem $Path -name)
但我知道这只是一次盲目的尝试,因为Get-ChildItem
正在返回一个迭代而不是一个可用的模式。
我怎样才能做我尝试做的事情,那就是获取文件名列表并在日志文件目录中递归搜索它们? #wishingitwasgrep
答案 0 :(得分:2)
Select-String
本质上是 PowerShell对grep
的实现。除了它不能单独递归。 Get-ChildItem
发挥作用的地方。
Get-ChildItem -Path "$LogPath\*.log" -Recurse |
Select-String -Pattern (Get-ChildItem $Path -Name) -SimpleMatch
通过使用别名以及位置而不是命名参数(不建议在脚本中使用),可以使语句更简洁一些(不过建议不要在脚本中使用)。
ls "$LogPath\*.log" -r | sls (ls $Path -n) -s
如果您想要正则表达式匹配而不是简单的字符串匹配,请删除-SimpleMatch
开关。
答案 1 :(得分:0)
你很亲密,但这里应该有用:
@(Get-Content -Path C:\logs\*.log) |
Where-Object { $_ -in @(Get-ChildItem -Path C:\the_path -Name) }
现在你有了一个文件列表。
我如何做我正在尝试做的事情获取文件名列表并在日志文件目录中递归搜索它们?
$List = Get-Content -Path 'C:\LogList.txt'
$LogList = @(Get-ChildItem -Path 'C:\Logs' -Recurse |
Where-Object { $_.Name -in $List })
这假设您的LogList.txt
有一个换行符分隔的日志文件名列表(例如MyLog.txt
)。然后,$LogList
会有一个System.IO.FileInfo
个对象数组,您可以利用它们对这些文件执行任何操作。例如:
$LogList | Remove-Item