我必须打开并搜索很多目录和.conf / .xml文件。我现在有这个:
$Path = "D:\Logs"
$Text = "*\log"
$PathArray = @()
$Results = "D:\Logs\Search.txt"
Get-Childitem $Path -Filter "*.conf" -Recurse |
Where-Object {$_.Attributes -ne "Directory"} |
ForEach-Object
{
If (Get-Content $_.FullName | Select-String -Pattern $Text -AllMatches)
{
$PathArray += $_.FullName
$PathArray += $_.FullName
}
}
Write-Host "Contents of ArrayPath:"
$PathArray | ForEach-Object {$_}
$PathArray | % {$_} | Out-File “D:\Logs\Search.txt”
我正在尝试创建此脚本,因此我可以使用.conf文件所在的正确路径将文件报告到txt文件中的所有.conf文件。我也会对此进行相同操作。简单地用.xml替换.conf文件.xml文件。截至目前,我正在获取.txt文件,但没有路径。我知道我错过了一两件事,但我无法弄清楚它是什么。我将不得不用我已创建的新闻手动更改旧路径。我想运行此脚本来搜索所有带有* \ log或* \ logs的.conf / .xml文件。
答案 0 :(得分:0)
你的正则表达式没有逃避反斜杠的问题,它显然与你所显示的.conf文件的典型内容不匹配。此外,它可以简化。试试这个 - 调整$ Text正则表达式以实际匹配.conf文件中的所需文本:
select now()::date;
now
------------
2015-07-03
(1 row)
答案 1 :(得分:0)
有几个问题。 Keith最大的一个是Select-String
默认使用正则表达式。同样,您有一些冗余,例如两次添加$pathArray
并使用ForEach-Object {$_}
。
我想展示仍然使用select-string
的解决方案,但使用其中的一些开关来获取您想要的用途。主要是-simplematch
,它按字面意思处理模式而不是正则表达式。我看到一个下划线引导示例文本中的日志,所以我在这里使用它。如果您不想或与您的数据不匹配,只需将其删除即可。
$Path = "D:\Logs"
$Text = "_log"
$Results = "D:\Logs\Search.txt"
$PathArray = Get-Childitem $Path -Filter "*.conf" -Recurse |
Where-Object {$_.Attributes -ne "Directory"} |
Where-Object{Select-string $_ -Pattern $Text -SimpleMatch -Quiet} |
Select-Object -ExpandProperty FullName
# Show results on screen
$PathArray
# Export results to file
$PathArray | Set-Content $Results