对象不断被命令污染

Object keeps getting contaminated by command

在我的脚本中,我 运行 像

这样的命令
[array]$Results = $AllSpamAllowGroups.Email | ForEach-Object {
    & gam update group $_ spam_moderation_level moderate
    
    [PSCustomObject]@{
        GroupEmail = $_
        Error      = $LastExitCode
    }
}

当我打开结果时是

"12"
"45"
"19"
...so on

如果我

& gam update group $_ spam_moderation_level moderate | out-null

那么$Results有好的数据。但是这个命令实际上并没有做任何事情。

我必须将它分配给垃圾变量吗?

$IAMTrash = & gam update group $_ spam_moderation_level moderate

看来我不应该这样做。 (垃圾变量也给出了很好的数据)

最好的做法是将不需要的输出分配给 $null,而不是“垃圾变量”。这实际上会丢弃输出并更好地传达您的意图。管道到 Out-Null 也可以,但是 less efficient.

[array]$Results = $AllSpamAllowGroups.Email | ForEach-Object {

    # Makes the command run completely silent (unless it writes to stderr too)
    $null = & gam update group $_ spam_moderation_level moderate
    
    # Only this gets captured in $Results
    [PSCustomObject]@{
        GroupEmail = $_
        Error      = $LastExitCode
    }
}

这种方法的缺点是您看不到程序在做什么。如果出现故障,它可能会输出有用的日志记录信息或详细的错误描述。使用上面的代码,所有这些都将丢失。

要查看命令输出而不让它“污染”您的结果,您可以将其通过管道传输到 Out-Host,这样它只会写入控制台,但不会被捕获:

[array]$Results = $AllSpamAllowGroups.Email | ForEach-Object {

    # Command output goes to console only
    & gam update group $_ spam_moderation_level moderate | Out-Host
    
    # Only this gets captured in $Results
    [PSCustomObject]@{
        GroupEmail = $_
        Error      = $LastExitCode
    }
}