这是我到现在想出来的:
Clear-Content e:\failure.txt #empty the output file
Get-Content C:\ProgramData\McAfee\DesktopProtection\Updatelog.txt | foreach {
if($_ -like "*Update process failed*") {
$_|out-file e:\failure.txt -Append
}
}
但有没有办法可以写作,或者每天都会逐步写入?
有没有办法从所有行中排除一个项目?
例如:
log file of mcafee: 9/29/2012
5:42:09 PM NT AUTHORITY\SYSTEM
Product(s) running the latest DATs.
我不想包括" NT AUTHORITY \ SYSTEM"在我正在复制的文件中。
答案 0 :(得分:0)
这比你想象的要容易。 McAfee日志是TAB DELIMITED!为了你的目的,这有多棒?您可以将其作为CSV导入,分隔符为Tab,并在导入时指定列(日期,时间,用户,消息),然后筛选您要输出的内容!
所以,比如:
$mcafee = import-csv C:\ProgramData\McAfee\DesktopProtection\UpdateLog.txt -Header "Date","Time","User","Message" -Delimiter "`t"
$McAfee | ?{$_.Date -eq (Get-date -f "M/d/yyyy") -and $_.Message -match "Update process failed"} | %{
"{0}`t{1}`t{2}" -f $_.Date, $_.Time, $_.Message | Out-File e:\failure.txt -Append
}
这只会获取当天的项目,只会显示更新失败的行,并且会排除用户名。
*为清楚起见,?{...}
是Where{...}
的缩写,%{...}
是ForEach{...}
的缩写。
修改:在上次评论中执行您尝试执行的操作的正确方法是:
import-csv C:\ProgramData\McAfee\DesktopProtection\UpdateLog.txt -Header "Date","Time","User","Message" -Delimiter "`t"|?{$_.Date -eq (Get-date -f "M/d/yyyy") -and $_.Message -match "Update process failed"}| %{"{0}`t{1}`t{2}" -f $_.Date, $_.Time, $_.Message | Out-File d:\logfile.txt -Append }
这是一个单行,但它很长,难以阅读,这可能是你遇到问题的原因。