从具有Powershell的目录中的列表中搜索日志以查找文件名

时间:2017-12-14 22:20:54

标签: powershell

我试图在日志目录中搜索文本文件内容,以匹配另一个目录中存在的文件名。

我知道我可以做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

2 个答案:

答案 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