如何将System.Array更改为System.Object?

时间:2019-05-14 13:11:07

标签: powershell powershell-v4.0

我有一个存储为System.Array的变量,显示为;

Site        : https://value.sharepoint.com/
Email       : value@value.co.uk
DisplayName : value
UniqueId    : value
AcceptedAs  : value@value.co.uk
WhenCreated : 24/01/2019 06:02:45
InvitedBy   : value_value.co.uk#ext#@value.onmicrosoft.com

当我尝试将此变量导出为文件时,它以相同的格式显示。由于这不是表格的正确结构(如下所示),因此当我尝试在Power BI中使用该数据时,将无法使用该数据。

Site                                               Email                ect                                                                                                                  
----                                               ----                 ----                                                                                                                 
https://value.sharepoint.com/                      value@value.co.uk    ect

我需要将数据放入上面显示的结构中。我已经尝试过;

$Test = New-Object -TypeName PSObject -Property  $ExternalUsers

但这会导致以下错误;

New-Object : Cannot convert 'System.Object[]' to the type 'System.Collections.IDictionary' required by parameter 'Property'. Specified method is not supported.

然后我尝试遍历数组中的所有项目,然后为每个项目创建一个对象,然后再将其添加到“主对象”中;

foreach($var in $ExternalUsers){
    $Test = New-Object -TypeName PSObject -Property  $ExternalUsers
    $Test | Add-Member -MemberType NoteProperty -Name Site -Value $var.Site
    $Test | Add-Member -MemberType NoteProperty -Name Email -Value $var.Email
    $TestObject += $Test
}

这使每个项目都具有正确的结构,但是当我尝试将所有项目重新添加到一个变量中时,我得到了错误;

Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named 'op_Addition'.

有什么想法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

在我看来,您好像有一个数组(System.Object[]),其中包含具有属性SiteEmail等的PSObjects。 像这样的结构非常适合导出到CSV文件,然后您可以将其导入到Excel等电子表格应用程序中。

为此,您可以使用cmdlet Export-Csv,如下所示:

$ExternalUsers | Export-Csv -Path 'PATH AND FILENAME FOR THE OUTPUT CSV FILE' -NoTypeInformation 

如果显示的输出是完整的,则似乎数组中只有一个元素。您可以通过查看$ExternalUsers.Count进行检查。

我不太确定您的意思是“因为这不是表格的正确结构” ,因为您可以很容易地使用

将其显示为表格
$ExternalUsers | Format-Table -AutoSize

控制台窗口上的输出:

Site                          Email             DisplayName UniqueId AcceptedAs        WhenCreated         InvitedBy                                   
----                          -----             ----------- -------- ----------        -----------         ---------                                   
https://value.sharepoint.com/ value@value.co.uk value       value    value@value.co.uk 24/01/2019 06:02:45 value_value.co.uk#ext#@value.onmicrosoft.com

如果所需的属性较少,则只需遍历数组并从其中的对象中选择要保留的属性:

$Shortened = $ExternalUsers | ForEach-Object {
    $_ | Select-Object Site, Email
}

$Shortened | Format-Table -AutoSize

会产生:

Site                          Email            
----                          -----            
https://value.sharepoint.com/ value@value.co.uk

我不喜欢Power BI,但是请记住Format-Table cmdlet仅用于在控制台上显示。
除了提供数据的视图之外,它不提供其他任何功能。

希望这会有所帮助

答案 1 :(得分:0)

使用:

$TestObject = @()

,无需指定(-Property $ ExternalUsers)

$Test = New-Object -TypeName PSObject