方法调用失败,因为[System.Management.Automation.PSObject]不包含名为“op_Addition”的方法

时间:2018-06-18 14:08:49

标签: powershell sharepoint

我正在尝试将一些数据从sharepoint列表导出到csv,我收到了这个错误:

$ ListItemCollection | Export-CSV“D:\ LX.csv”-NoTypeInformation

Method invocation failed because [System.Management.Automation.PSObject] doesn't contain a method named 'op_Addition'.
At line:20 char:2
+     $ListItemCollection += $ExportItem
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

代码非常简单

$URL = "https://mysite"
$List = "Page Contents"

$Web = Get-SPWeb $URL

$web
$spList = $Web.Lists[$List]
$Items = $spList.GetItems()


$listItems = $spList.Items

foreach($item in $listItems) {

    $ExportItem = New-Object PSObject 
    $ExportItem | Add-Member -MemberType NoteProperty -name "PageID" -value $item["PageID"]
    $ExportItem | Add-Member -MemberType NoteProperty -Name "Html Component" -value $item["Html Component"]

    #Add the object with property to an Array
    $ListItemCollection += $ExportItem
} 

2 个答案:

答案 0 :(得分:3)

<强> TL; DR:

  • $ListItemCollection的类型为[System.Management.Automation.PSObject],而不是数组。

  • 确保$ListItemCollection = @()数组(例如,+=)按预期工作,即+=追加元素 [1]

    • 请注意,通常输出多个项目的命令 - 如果分配给变量,则会在常规[object[]]数组中收集 - 输出只有标量如果命令在情境上恰好只返回一个项目;换句话说:单项输出数组会自动解包

    • 因此,如果命令有可能在情境上仅返回单个对象,但则需要总是的结果为 >数组,使用@(...) array-subexpression operator;例如:

      # @(...) ensures that $file is an array, even if just 1 file matches
      $files = @(Get-ChildItem *.txt)
      

错误消息表明$ListItemCollection的类型为[System.Management.Automation.PSObject]不是数组。

由于类型[pscustomobject][System.Management.Automation.PSObject])没有静态op_Addition方法,因此您不能将+运算符与其实例一起用作LHS。
(特定于类型的运算符实现为静态op_*方法)。

您可以按如下方式验证:

PS> (New-Object System.Management.Automation.PSObject) + 1 # !! Breaks
Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named 'op_Addition'

如果要检查给定类型以获取操作员支持,请使用以下命令,以[datetime]类型为例:

PS> [datetime] | Get-Member -Force -Static -Type Method op_*

   TypeName: System.DateTime

Name                  MemberType Definition
----                  ---------- ----------
op_Addition           Method     static datetime op_Addition(datetime d, timespan t)
op_Equality           Method     static bool op_Equality(datetime d1, datetime d2)
op_GreaterThan        Method     static bool op_GreaterThan(datetime t1, datetime t2)
op_GreaterThanOrEqual Method     static bool op_GreaterThanOrEqual(datetime t1, datetime t2)
op_Inequality         Method     static bool op_Inequality(datetime d1, datetime d2)
op_LessThan           Method     static bool op_LessThan(datetime t1, datetime t2)
op_LessThanOrEqual    Method     static bool op_LessThanOrEqual(datetime t1, datetime t2)
op_Subtraction        Method     static datetime op_Subtraction(datetime d, timespan t), static timespan op_Subtraction(datetime d1, datetime d2)

注意:

  • “原始”.NET数据类型具有此类方法,因为内置了对它们的运营商支持。

  • 同样,PowerShell本身为数组和集合(+[object[]],...)实现[System.Collections.Generic.List[object]],但请注意(a)新实例总是被构造而且(b)结果总是类型[object[]](除非你使用一个类型约束的变量将数组转换回不同的集合类型)。

  • -Force是必需的,因为Get-Member默认隐藏op_*方法。

[1]从技术上讲,在幕后创建 new 数组,因为数组是不可变的。在循环中,这可能是一个性能问题;如果是这样,请使用可变集合类型,例如[System.Collections.Generic.List[object]],并使用其.Add()方法附加到它。

答案 1 :(得分:0)

谢谢@ mklement0这是我的代码

Write-Output "Processing user report..."
foreach ($User in $AgedUsers) {
    $hash = @{
        Name            =   $user.Name
        Account         =   $user.SamAccountName
        LastLogon       =   $user.LastLogonDate
        }
    $Build = New-Object PSObject -Property $hash
    $UserReport += $Build
    Write-Output "Data added to report for $($User.SamAccountName)"
    $UsersLogged = $UsersLogged + 1
    }

并简单地添加

$UserReport = @()

在foreach循环修复该问题之前