使用自定义字段格式化PowerShell输出

时间:2012-12-15 18:59:47

标签: powershell scripting

我对PowerShell有点新,并且无法正确格式化我正在编写的脚本的输出。

该片段的第一行返回我想要格式化的对象数组(打印机事件日志中的事件ID 372)。第二行打印出位置3中对象所需的属性:

$error_372 = Get-WinEvent -LogName 'Microsoft-Windows-PrintService/Admin'| ? {$_.Id -eq '372'}
$error_372[3].Properties[0,1,2,4]

以上输出返回以下内容:

Value                                                     
-----                                                     
Print Document                                            
Ahmet                                                     
Canon MP560 series Printer                                
131072

我想要以这样的格式返回所有对象:

Document Name        User Name        Printer Name        Document Size 
-------------        ---------        ------------        -------------
Print Document        Ahmet           Canon MP560...      131072
 yada yada            yada             yada                yada

最终,我需要在CSV中使用它,但我想我会尝试在屏幕上正确打印它。

4 个答案:

答案 0 :(得分:1)

您可以像这样构建所需的对象:

$error_372 | % { 
    $out =  new-object psobject;
    $out | add-member -Type noteproperty -Name "Document Name" -Value $_.Properties[0];
    $out | add-member -Type noteproperty -Name "User Name" -Value $_.Properties[1]
    $out | add-member -Type noteproperty -Name "Printer Name e" -Value $_.Properties[2]
    $out | add-member -Type noteproperty -Name "Document Size" -Value $_.Properties[4] -PassThru 
}

注意最后-PassThru行的Add-Member,它返回构造到管道的对象。

答案 1 :(得分:1)

试试这个:

$error_372 | % { 
    $out =  new-object psobject;
    $out | add-member -Type noteproperty -Name "Document Name" -Value ($_.Properties[0] | select -expa value)
    $out | add-member -Type noteproperty -Name "User Name" -Value ($_.Properties[1] | select -expa value)
    $out | add-member -Type noteproperty -Name "Printer Name e" -Value ($_.Properties[2]| select -expa value)
    $out | add-member -Type noteproperty -Name "Document Size" -Value ($_.Properties[4] | select -expa value) -PassThru 
}

或更好:

$error_372 | % { 
    $out =  new-object psobject;
    $out | add-member -Type noteproperty -Name "Document Name" -Value ($_.Properties[0].value)
    $out | add-member -Type noteproperty -Name "User Name" -Value ($_.Properties[1].value)
    $out | add-member -Type noteproperty -Name "Printer Name e" -Value ($_.Properties[2].value)
    $out | add-member -Type noteproperty -Name "Document Size" -Value ($_.Properties[4].value) -PassThru 
}

答案 2 :(得分:1)

您还可以使用New-Object cmdlet(而不是多个Add-Member调用):

Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-PrintService/Admin'; Id=372} | Foreach-Object{

    New-Object PSObject -Property @{
        DocumentName = $_.Properties[0].Value
        UserName = $_.Properties[1].Value       
        PrinterName = $_.Properties[2].Value
        DocumentSize = $_.Properties[4].Value
    }

}

答案 3 :(得分:-1)

您可以为每个事件创建一个包含所需属性(文档名,用户名...)的自定义PS对象。使用event-objects中的值填充属性。将它们收集在一个数组中并导出到csv。自定义对象的创建解释为here

$array = @()

$error_372 | % { 
$out =  new-object psobject;
$out | add-member -NotePropertyName "Document Name" -NotePropertyValue ($_.Properties[0].value)
$out | add-member -NotePropertyName "User Name" -NotePropertyValue ($_.Properties[1].value)
$out | add-member -NotePropertyName "Printer Name" -NotePropertyValue ($_.Properties[2].value)
$out | add-member -NotePropertyName "Document Size" -NotePropertyValue ($_.Properties[4].value)
$array += $out
}

$array | export-csv -path events.csv

编辑:-Noteproperty...参数似乎需要PS3.0。