【问题标题】:Format PowerShell Outputs with Custom Fields使用自定义字段格式化 PowerShell 输出
【发布时间】:2015-11-01 10:17:23
【问题描述】:

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

sn-p 的第一行返回我要格式化的对象数组(打印机事件日志中的事件 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 中使用它,但我想我会先尝试在屏幕上正确打印它。

【问题讨论】:

    标签: powershell scripting


    【解决方案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
        }
    
    }
    

    【讨论】:

    • 我更喜欢这种方法,但返回输出看起来像:System.Diagnostics.Ev... 而不是实际数据。你知道我做错了什么吗?
    • 我在 $_.Properties[0] 之后附加了“.value”,一切都很好。谢谢!
    • 谢谢,我也加了:)
    【解决方案2】:

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

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

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

    【讨论】:

    • 当我尝试按照您的建议进行操作时,输出如下:
    • 你需要用管道捕获它并保存,或者先创建一个数组$array = @(),然后将此行添加到foreachloop的末尾$array += $out(而不是-passthru)。
    【解决方案3】:

    试试这个:

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

    【讨论】:

      【解决方案4】:

      您可以为每个事件创建具有所需属性(文档名、用户名...)的自定义 PSobject。使用来自事件对象的值填充属性。将它们收集在一个数组中并导出到 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-30
        • 2022-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-05
        • 2014-12-31
        • 2020-02-21
        相关资源
        最近更新 更多