从powershell输出中提取特定文本

时间:2018-03-30 14:29:29

标签: string powershell

PS Scripting的新手,我正在寻求以下戴尔服务器要求的帮助:

读取事件ID 2048的系统事件日志,提取生成偶数的时间,特定RAID控制器上的物理磁盘编号。

例如:

Get-WinEvent -FilterHashtable @{logname='System' ; id=2048} -MaxEvents 1

返回输出:

ProviderName: Server Administrator

TimeCreated Id LevelDisplayName Message 
----------- -- ---------------- ------- 
3/26/2018 1:18:51 AM 2048 Error Device failed: Physical Disk 0:0:13 Controller 0, Connector 0

我想以下列格式提取磁盘和控制器编号以及日期:

**Disk-Failure, Date = 3/26/2018 1:18:51 AM , Physical Disk Number = 0:0:13 , Controller = 0 , Connector = 0**

请协助。

谢谢。

1 个答案:

答案 0 :(得分:1)

正则表达式可能是解决此问题的好方法。它可以从消息属性中选择项目。

[regex]$rx = '.*Physical Disk (?<pd>.*) Controller (?<ctrl>.*), Connector (?<conn>.*).*'

Get-WinEvent -FilterHashtable @{logname='System' ; id=2048} -MaxEvents 1 |
    ForEach-Object {
        $r = $rx.Match($_.Message)
        $pd = $r.Groups['pd'].Value
        $ctrl = $r.Groups['ctrl'].Value
        $conn = $r.Groups['conn'].Value

        %{[string]::Format('**Disk-Failure, Date {0} , Physical Disk Number = {1} , Controller = {2} , Connector {3}', `
            $_.TimeCreated, $pd, $ctrl, $conn)}
    }

为了测试这一点,由于我的机器上没有任何磁盘故障,因此我创建了一个具有Get-WinEvent所呈现属性的对象。

$properties = @{'TimeCreated'='3/26/2018 1:18:51 AM';
                'Id'=2018;
                'LevelDisplayName'='Error';
                'Message'= 'Device failed: Physical Disk 0:0:13 Controller 0, Connector 0'}
$object = New-Object -TypeName PSObject -Prop $properties