PowerShell“;预付款;解析以根据日志文件计算组件安装时间

PowerShell“;预付款;解析以根据日志文件计算组件安装时间,powershell,scripting,Powershell,Scripting,我有一个创建以下格式日志文件的应用程序: 2009-03-27 15:30:50 Start 2009-03-27 15:30:51 Starting Component 1 Installation 2009-03-27 15:30:52 blah 2009-03-27 15:30:53 blah 2009-03-27 15:30:54 blah 2009-03-27 15:30:55 ~~~ Finished Component 1 Installation ~~~ 2009-03-27 1

我有一个创建以下格式日志文件的应用程序:

2009-03-27 15:30:50 Start
2009-03-27 15:30:51 Starting Component 1 Installation
2009-03-27 15:30:52 blah
2009-03-27 15:30:53 blah
2009-03-27 15:30:54 blah
2009-03-27 15:30:55 ~~~ Finished Component 1 Installation ~~~
2009-03-27 15:30:56 Starting Component 2 Installation
2009-03-27 15:30:57 blah
2009-03-27 15:30:58 blah
2009-03-27 15:30:59 blah
2009-03-27 15:30:60 ~~~ Finished Component 2 Installation ~~~
2009-03-27 15:30:61 Starting Component 3 Installation
2009-03-27 15:30:62 blah
2009-03-27 15:30:63 blah
2009-03-27 15:30:64 blah
2009-03-27 15:30:65 ~~~ Finished Component 3 Installation ~~~
2009-03-27 15:30:66 Finished
我想你明白格式的意思了

我想要实现的是有一个powershell脚本,它将返回一个显示结果的表

  • 组件名称
  • 开始时间
  • 结束时间
  • 耗时
  • 我称之为“高级”脚本,因为它可能包括:解析、格式化、创建新对象等

    • 我是powershell的新手

      • 以下脚本可能会为您完成此操作如果使用合理的时间值。。。一分钟内超过60秒是很奇怪的(这里给了我一些异常,这些异常在日期/时间解析过程中引起了很大的麻烦,直到我注意到为什么会抛出异常…)

        我可以使用以下代码将执行时间缩短一点(大约25%):

        $logfile = $args[0]
        
        foreach ($l in Get-Content $logfile) {
            if ($l.Length -ge 30) {
                if ($l.Substring(20,8) -eq "Starting") {
                    $c = New-Object PSObject
                    $st = [DateTime]::ParseExact($l.Substring(0,19), "yyyy'-'MM'-'dd HH':'mm':'ss", $null)
                    $c | Add-Member -Type NoteProperty -Name Component -Value $l.Substring(29, $l.Length - 42)
                    $c | Add-Member -Type NoteProperty -Name StartTime -Value $st
                } elseif ($l.Substring(24,8) -eq "Finished") {
                    $et = [DateTime]::ParseExact($l.Substring(0,19), "yyyy'-'MM'-'dd HH':'mm':'ss", $null)
                    $c | Add-Member -Type NoteProperty -Name EndTime -Value $et
                    $c | Add-Member -Type NoteProperty -Name TimeTaken -Value ($c.EndTime - $c.StartTime)
                    $c
                }
            }
        }
        

        但我发现它的可读性(更不用说可维护性)远不如第一个解决方案。这与日志文件的布局紧密相连。

        感谢您的脚本(并为秒数错误道歉!)。从功能的角度来看,脚本运行得很好,但从性能的角度来看,它运行得很慢,您能建议什么可以使它更快吗?目前,脚本读取完整的日志文件,然后进行处理。我只是在一个800kib的日志文件上进行了尝试,第一次读取、然后解析和在管道中执行之间的差异并不明显(事实上,管道甚至更慢)。目前还不知道如何使它更快。新对象和添加成员调用大约占运行时的一半。使用regex解析显然是另一半(日期/时间解析不明显)。不过,没有正则表达式的重写不会很有趣或可读。谢谢您的及时回复。最初,当我尝试使用管道来做这件事,而不是使用散列将相关属性添加到所需的对象时,您的解决方案更容易理解,。。你是如何检查它的性能的?是否有编译正则表达式的选项?
        $logfile = $args[0]
        
        foreach ($l in Get-Content $logfile) {
            if ($l.Length -ge 30) {
                if ($l.Substring(20,8) -eq "Starting") {
                    $c = New-Object PSObject
                    $st = [DateTime]::ParseExact($l.Substring(0,19), "yyyy'-'MM'-'dd HH':'mm':'ss", $null)
                    $c | Add-Member -Type NoteProperty -Name Component -Value $l.Substring(29, $l.Length - 42)
                    $c | Add-Member -Type NoteProperty -Name StartTime -Value $st
                } elseif ($l.Substring(24,8) -eq "Finished") {
                    $et = [DateTime]::ParseExact($l.Substring(0,19), "yyyy'-'MM'-'dd HH':'mm':'ss", $null)
                    $c | Add-Member -Type NoteProperty -Name EndTime -Value $et
                    $c | Add-Member -Type NoteProperty -Name TimeTaken -Value ($c.EndTime - $c.StartTime)
                    $c
                }
            }
        }