Powershell将输出写入文件

yk9xbfzb  于 2023-11-18  发布在  Shell
关注(0)|答案(3)|浏览(142)

我有一个脚本,搜索几个.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
            
    }

字符串

guicsvcw

guicsvcw1#

Select-String命令将执行您想要的操作。

(Select-String -Pattern 'Keyword' -Path *.eml -List).Path | Out-File -Path File.txt

字符串

piztneat

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仅在您传递 * 多行字符串 * 作为输入时才执行此操作:

Get-ChildItem -PipelineVariable file $Path\*.eml |
  Get-Content -Raw |
  Select-String 'KeyWord' |
  ForEach-Object { $file.FullName } |
  Out-File File.txt

字符串
注意事项:

  • 带有自选变量$file的公共-PipelineVariable参数(必须指定 * 而不带 * $前缀),以便可以在稍后的ForEach-Object调用中引用手头的输入文件。
  • 该解决方案依赖于Select-String在未找到模式时不产生 * 输出 *,因此ForEach-Object调用仅接收匹配文件的输入。
  • ForEach-Object调用实际上并不使用Select-String的输出对象;接收输入的事实意味着找到了一个匹配,而$file.FullName,即手头输入文件的完整路径被输出。
  • 请注意,-AppendOut-File调用中是 * 不 * 需要的,因为这个单一调用接收 * 所有 * 内容写入文件。

或者,在没有Select-String的情况下(使用-match运算符的自己方法的修正版本):

Get-ChildItem $Path\*.eml |
  Where-Object { ($_ | Get-Content -Raw) -match 'KeyWord' } |
  ForEach-Object FullName |
  Out-File File.txt


至于你尝试了

$_.FullName | out-file File.txt -Append


代码中的这一行没有连接到上面的Get-Content $_ -raw | Where-Object ...管道,因此对每个输入文件都执行 * 无条件 *。
要按预期连接它,您必须使用|和 * 另一个 * ForEach-Object调用,如下所示,但请注意,上面的解决方案更简单,更有效:

# Works, but the above solutions are better.
Get-Content $_.FullName -Raw |
  Where-Object { $_ -match "KeyWord" } |
  ForEach-Object { $_.FullName | Out-File File.txt -Append }

ozxc1zmp

ozxc1zmp3#

最后的答案。特别感谢所有@mklement0

$Path = "C:\a\b"
$Match
$NoMatch
ForEach-Object {
        Get-ChildItem -Path $Path\*.eml -Recurse |
    Select-String -Pattern $Match -Exclude $NoMatch -List | 
    ForEach-Object path | 
    Out-File G:\APPS\temp\Eric\outfile.txt
      
    }

字符串

相关问题