我有一个脚本,搜索几个.eml文件的关键字。我想是输出的eml文件路径和名称的所有.eml文件匹配的关键字搜索的文件。
所以我搜索.eml文件,如果它找到关键字,我将文件路径和名称输出到一个文本文件。我没有得到预期的输出。相反,我得到目录中每个文件的路径和名称。我想在Where-Object上使用silentlyContinue,但这也不起作用。
$Path = Path to directory with .eml files
$mess = Get-ChildItem $Path\*.eml
$mess |
ForEach-Object {
Get-Content $_ -raw |
Where-Object{$_ -match "KeyWord"}
$_.FullName | out-file output File.txt -Append
}
字符串
3条答案
按热度按时间guicsvcw1#
Select-String
命令将执行您想要的操作。字符串
piztneat2#
补充lit's helpful
Select-String
-based answer:使用文件路径作为参数(例如
Select-String -Path *.eml ...
)或从Get-ChildItem
输入文件信息管道(例如Get-ChildItem *.eml | Select-String ...
),Select-String
总是逐行搜索。您使用
Get-Content -Raw
表明您可能希望搜索 * 跨多行 *,Select-String
仅在您传递 * 多行字符串 * 作为输入时才执行此操作:字符串
注意事项:
$file
的公共-PipelineVariable
参数(必须指定 * 而不带 *$
前缀),以便可以在稍后的ForEach-Object
调用中引用手头的输入文件。Select-String
在未找到模式时不产生 * 输出 *,因此ForEach-Object
调用仅接收匹配文件的输入。ForEach-Object
调用实际上并不使用Select-String
的输出对象;接收输入的事实意味着找到了一个匹配,而$file.FullName
,即手头输入文件的完整路径被输出。-Append
在Out-File
调用中是 * 不 * 需要的,因为这个单一调用接收 * 所有 * 内容写入文件。或者,在没有
Select-String
的情况下(使用-match
运算符的自己方法的修正版本):型
至于你尝试了:
型
代码中的这一行没有连接到上面的
Get-Content $_ -raw | Where-Object ...
管道,因此对每个输入文件都执行 * 无条件 *。要按预期连接它,您必须使用
|
和 * 另一个 *ForEach-Object
调用,如下所示,但请注意,上面的解决方案更简单,更有效:型
ozxc1zmp3#
最后的答案。特别感谢所有@mklement0
字符串