如何解决解释 Powershell [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
如果我在 [void]
之前使用 $Groups.Add($Group.Name)
它可以正常工作,但没有 [void]
,脚本返回一个空的 .CSV
文件。
为什么会发生这种情况?
解决方法
-
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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。