Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建PowerShell自定义对象_Powershell_Sharepoint - Fatal编程技术网

创建PowerShell自定义对象

创建PowerShell自定义对象,powershell,sharepoint,Powershell,Sharepoint,我在PowerShell中创建了一个自定义对象。我能解决我想解决的问题。我想要一个有两列的对象,一列用于网站集,一列用于电子邮件 然而,我想知道是否有一个更简单的解决办法。你有什么建议吗 这是我的密码: $cred = Get-Credential Connect-PnPOnline "https://tenant.sharepoint.com" -Credentials $cred $SiteCollections = Get-PnPTenantSite $object = @() fo

我在PowerShell中创建了一个自定义对象。我能解决我想解决的问题。我想要一个有两列的对象,一列用于网站集,一列用于电子邮件

然而,我想知道是否有一个更简单的解决办法。你有什么建议吗

这是我的密码:

$cred = Get-Credential

Connect-PnPOnline "https://tenant.sharepoint.com" -Credentials $cred
$SiteCollections = Get-PnPTenantSite

$object = @()

foreach ($SiteCollection in $SiteCollections) {
    Connect-PnPOnline -Url $SiteCollection.Url -Credentials $cred
    $email = Get-PnPRequestAccessEmails
    Write-Host "Email for $($SiteCollection.Url): $($email)"

    $obj = New-Object System.Object
    $obj | Add-Member -type NoteProperty -name Url -value $SiteCollection.Url
    $obj | Add-Member -type NoteProperty -name Email -value $email
    $object += $obj
}

Write-Output $object

可以使用
newobject
cmdlet从哈希表构造对象:

$obj = New-Object -Type PSObject -Property @{
    'Url'   = $SiteCollection.Url
    'Email' = $email
}
或者(如果您有PowerShell v3或更高版本),请使用
[PSCustomObject]
类型加速器:

$obj = [PSCustomObject]@{
    'Url'   = $SiteCollection.Url
    'Email' = $email
}
此外,您还可以简单地输出循环内的对象,并在变量中收集整个循环输出,如下所示:

$object = @(foreach ($SiteCollection in $SiteCollections) {
    ...
    New-Object -Type PSObject -Property @{
        'Url'   = $SiteCollection.Url
        'Email' = $email
    }
})
foreach
循环周围的数组子表达式操作符(
@()
)确保结果是一个数组,即使循环输出少于2个对象

使用计算属性是另一种选择:

$object = @(Get-PnPTenantSite | Select-Object Url, @{n='Email';e={
    Connect-PnPOnline -Url $_.Url -Credentials $cred | Out-Null
    Get-PnPRequestAccessEmails
}})

将代码缩短一点:

$cred = Get-Credential
Get-PnPTenantSite | ForEach-Object {
  Connect-PnPOnline -Url $_.Url -Credentials $cred
  [PSCustomObject] @{
    Url = $_.Url
    Email = Get-PnPRequestAccessEmails
  }
}

<代码> [PSCuthObjult] 类型加速器只存在于PultS壳3和以后。

特别是如果您的数组将变得非常大,您可能需要考虑使用ARARYLIST而不是香草数组。对于标准数组,每次向其添加数据时,它都会重新创建整个数组,而不是将数据固定在最后。arraylist只是简单地附加,构建大型阵列的速度要快得多

$outArray = New-Object System.Collections.ArrayList

foreach ($SiteCollection in $SiteCollections) {
    Connect-PnPOnline -Url $SiteCollection.Url -Credentials $cred
    $email = Get-PnPRequestAccessEmails
    Write-Host "Email for $($SiteCollection.Url): $($email)"

    $obj = New-Object System.Object
    $obj | Add-Member -type NoteProperty -name Url -value $SiteCollection.Url
    $obj | Add-Member -type NoteProperty -name Email -value $email
    [void]$outArray.Add($obj)
}

@()
中包装内容的替代方法:我更喜欢将内容强制转换为
[array]
类型,因为我以后更容易发现。例如
[array]$object=ForEach($SiteCollections中的SiteCollection){
我以为整个数组问题都在PowerShell v2和更早版本中?使用
[pscustomobject]消除了在数组中包装变量的必要性?@ BACONBIT在PosivsV3中减轻了一些问题,是的,但是除非你使它发生,否则你仍然不能神奇地得到一个数组。例如,考虑一个循环不返回任何结果的情况。在这种情况下,你将得到一个空值。即使在PowerShell v3及更新版本中,lue仍会给您一个错误。此外,如果可能的话,我更愿意让我的答案向后兼容,尽管这个答案并没有树立一个好的榜样。我应该在第三个示例中使用
新对象
。另请参见: