我正在尝试将一些数据从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
}
答案 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循环修复该问题之前