gpt4 book ai didi

powershell - 解释 Powershell [void] 行为

转载 作者:行者123 更新时间:2023-12-05 02:02:18 27 4
gpt4 key购买 nike

我的脚本将一些信息从 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com