我有这个小代码,它将日志文件中生成的错误复制到文本文件中,但我也想要将错误复制到的文件名称复制到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"
我还想知道是否可以打开同时复制错误的文件。如果是,我怎么能这样做?
答案 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; '---'}