0

我对 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

4 回答 4

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一行将构造的对象返回到管道的最后一行。

于 2012-12-15T19:31:56.387 回答
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 
}
于 2012-12-15T20:10:49.090 回答
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
    }

}
于 2012-12-16T07:12:53.483 回答
-1

您可以为每个事件创建具有所需属性(文档名、用户名...)的自定义 PSobject。使用来自事件对象的值填充属性。将它们收集在一个数组中并导出到 csv。此处解释了自定义对象的创建

$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。

于 2012-12-15T19:21:07.757 回答