如何将文件名复制到发生错误的文本文件中?

时间:2017-12-01 07:36:43

标签: powershell

我有这个小代码,它将日志文件中生成的错误复制到文本文件中,但我也想要将错误复制到的文件名称复制到result.txt。

# Path of the log files
$file = "C:\Sdemo\powershell scripts\demo folder\*.txt"

# Copies the error to the result,txt from log files.
(gc $file) -match 'Error:' > "C:\Sdemo\powershell scripts\New folder\result.txt"

我还想知道是否可以打开同时复制错误的文件。如果是,我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

使用Select-String。它会自动将文件名和行号添加到输出中。

$file = 'C:\Sdemo\powershell scripts\demo folder\*.txt'
Get-ChildItem $file |
    Select-String -Pattern 'Error:' |
    Set-Content 'C:\Sdemo\powershell scripts\New folder\result.txt'

如果您希望文件名仅在每个文件的错误上方一次,您可以执行以下操作:

Get-ChildItem $file | ForEach-Object {
    $m = (Get-Content $_.FullName) -match 'Error:'
    if ($m) {
        $_.FullName, $m | Add-Content 'C:\Sdemo\powershell scripts\New folder\result.txt'
    }
}

但是,我不建议使用后者,因为当每行以文件名为前缀时,过滤数据要容易得多,并且您可以轻松地从冒号分隔的文本中删除文件名和行号。 / p>

答案 1 :(得分:0)

考虑所有意见:

#Path of the log files
$file= "C:\Sdemo\powershell scripts\demo folder\*.txt"

$lastFile = [string]::Empty
#Copies the error to the result,txt from log files.
(Get-Content $file) -match 'Error:' | 
    ForEach-Object {
        if ( $_.PSPath -ne $lastFile) { $_.PSPath } # output merely on PSPath change
        $_                                          # output matching line
        $lastFile = $_.PSPath                       
    } > "C:\Sdemo\powershell scripts\New folder\result.txt"

看一下以下命令的输出;您可以使用PSChildName属性(仅文件名)而不是PSPath(完全限定的文件名):

(gc $file) -match 'Error:' | % {$_ | get-member -MemberType Properties; '---'}