powershell - 解释 Powershell [void] 行为

标签 powershell sharepoint void

我的脚本将一些信息从 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 隐式 输出既没有在变量中捕获的值,也没有被抑制(如 [void] (...)$null = ...,或 Out-Null),重定向(使用 >/>>>),也不会通过管道发送(|) 到另一个命令。

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

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

  • [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()

关于powershell - 解释 Powershell [void] 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65906608/

相关文章:

powershell - Powershell Arraylist RemoveAt不起作用

sql - 为什么我通过 Start-Job 执行的 SQL 没有返回我期望的答案?

c# - 以编程方式将用户添加到列表

c - 声明为 void* foo() 的函数

windows - 如何解决 Windows 上 Julia 中的包安装错误?

powershell - 在 PowerShell 控制台中对 native 命令行应用程序的输出日志进行着色

iPhone : Sharepoint GetListItemChangesSinceToken method returns item recursively

c# - 如何使用 CAML 查询筛选 SharePoint 列表?

android - flutter "this function has a return type of void and cannot be used"

使用 void 指针数组时出现 C++ 错误