Powershell脚本错误 - 无法验证参数'Property'的参数:无法索引到空数组

时间:2016-08-23 14:21:28

标签: powershell null powershell-v4.0

我已经运行了本文中的Powershell脚本:How to detect applications using "hardcoded" DC name or IP

The code is as follows:

text.setInputType(inputEditText.getInputType() | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); // forced capitalization
text.setInputType(inputEditText.getInputType() & ~ InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); // negate the flag

我收到的错误是:

Get-WinEvent -ComputerName dc01.contoso.com -MaxEvents 1000 -FilterHashtable @{LogName="Directory Service" ; ID=1139 } | ForEach-Object ` 
{
 $_info = @{
 "Operation" = [string] $_.Properties.Value[0]
 "User" = [string] $_.Properties.Value[2]
 "IP:Port" = [string] $_.Properties.Value[3]
 }
 New-Object psobject -Property $_info
 } 

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

<强> TL;博士

Get-WinEvent -ComputerName dc01.contoso.com -MaxEvents 1000 -FilterHashtable @{
  LogName="Directory Service" ; ID=1139 } |
    ForEach-Object {
      [pscustomobject] @{
        "Operation" = try { [string] $_.Properties.Value[0] } catch {}
        "User" =      try { [string] $_.Properties.Value[2] } catch {}
        "IP:Port" =   try { [string] $_.Properties.Value[3] } catch {}
      }
    }
  • Cannot index into a null array错误消息告诉您$_.Properties.Value$null而不是数组,因此尝试访问此非数组的元素失败 [1]

这意味着至少有一些事件日志记录没有嵌入的数据值。

  • New-Object : Cannot validate argument on parameter 'Property'只是一个后续错误,抱怨-Property参数为$null,因为初始错误导致$_info成为$null {1}}。)

    • 最简单的解决方案是使用一个嵌入try { ... } catch {}引用的嵌入式$_.Properties.Value[<n>]处理程序,当$_.Properties.Value$null时会悄悄地忽略这种情况并导致整体子表达式返回$null

    • 另请注意如何将哈希表文字(@{ ... })直接转换为类型加速器[pscustomobject],以便将其转换为自定义对象。

[1]请注意,自PSv3以来,尝试索引非$null不是数组的值不会失败,但悄然返回$null;例如:$v=20; $v[1] # -> $null
索引到字符串值是一种特殊情况,但是:它返回指定位置的字符$v='hi'; $v[1] # -> 'i'