我对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中使用它,但我想我会尝试在屏幕上正确打印它。
答案 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。