【问题标题】:Explain Powershell [void] behavior解释 Powershell [void] 行为
【发布时间】:2021-01-26 17:53:36
【问题描述】:

我的脚本将一些信息从 Sharepoint 站点导出到 .CSV 文件。

# Enter Web Application URL
$WebAppURL="http://server"

# Enter Path to CSV-file
$CSVFilePath="Path"

$SiteCollections = Get-SPWebApplication $WebAppURL | Get-SPSite -Limit All

$Tree = foreach ($Site in $SiteCollections) {
    foreach ($Web in $Site.AllWebs) {
    $Groups = New-Object System.Collections.ArrayList
        foreach ($Group in $web.Groups) {
            [void]$Groups.Add($Group.Name)
        }

        $Groups = $Groups -join ','
        [PSCustomObject]@{
            Url = $web.URL
            Title = $web.Title
            CountOfLists= $web.Lists.Count
            PermissionsInherited = $web.Permissions.Inherited
            Groups = $Groups
            }
    }
}

$Tree | Export-CSV $CSVFilePath -NoTypeInformation -Encoding UTF8

如果我在$Groups.Add($Group.Name) 之前使用[void],它可以正常工作,但没有[void],脚本会返回一个空的.CSV 文件。

为什么会这样?

【问题讨论】:

    标签: powershell sharepoint void


    【解决方案1】:
    • PowerShell 隐式 输出的值既不会在变量中捕获,也不会被抑制(如[void] (...)$null = ...Out-Null)、重定向(使用> / >> ),也不会通过管道 (|) 发送到另一个命令。

      • 有关此行为背后的设计原理,请参阅 this answer 的底部。
    • $Groups.Add($Group.Name) 输出一个[int] (System.Int32) 值(新附加元素的索引),所以如果没有[void] 强制转换,这个整数首先成为内部循环的一部分,然后是外部foreach 循环的一部分输出[1],从而有效地第一个$Tree中捕获输出对象。

    • 当通过管道将对象传送到Export-Csv 时,只有第一个 对象根据该对象的(公共)属性确定要导出的列。

    • [int] 实例本身只是一个值,它没有任何属性,因此生成的 CSV 文件实际上是空的。


    [1] System.Collections.ArrayList 的通用等效项是 System.Collections.Generic.List`1,其 .Add() 方法确实返回一个值,这就是为什么它在 PowerShell(和一般来说)。等效的构造调用将是:
    $Groups = New-Object System.Collections.Generic.List[object] 或者,在 PSv5+ 中,
    $Groups = [System.Collections.Generic.List[object]]::new()

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多