PowerShell抑制输出

时间:2016-10-27 14:28:50

标签: powershell

我已经检查并尝试了一些关于StackOverflow的建议,但它们似乎都没有效果。我把我想要完成的事情放在一起。

[System.Random] $rand = New-Object System.Random
$randomNumbers = New-Object int[] 10;
[int[]] $randomNumbers;
for($i = 0; $i -lt $randomNumbers.Length; $i++)
{
    ($randomNumbers[$i] = $rand.Next(256)) 2>&1 | Out-Null;
}

我试过了

> $Null
|Out-Null
2>&1

但他们似乎都没有抑制输出。它连续显示10个零。每个作业一个。如何抑制输出?

3 个答案:

答案 0 :(得分:5)

删除{{1}}。它不是打印的赋值,而是空数组。

答案 1 :(得分:2)

替换代码的其他解决方案;)

 [int[]] $randomNumbers=1..10 | %{ Get-Random -maximum 256 }

答案 2 :(得分:1)

补充Andrey Marchuk's effective answer

  • [int[]] $randomNumbers 看起来类似于类型绑定的PowerShell变量声明,但是,因为没有分配值,它只是一个强制转换 $randomNumbers的预先存在的值 - 一个10个元素的0值数组 - 只是强制转换为{{1 (在这种情况下是一个无操作),然后是输出 - 在这种情况下产生10行,每行[int[]]

    • 0语句(低效)等效的真正的类型绑定分配是New-Object int[] 10
      请注意,[int[]] $randomNumbers = @( 0 ) * 10的存在使得此语句成为隐式创建变量的赋值
    • PowerShell在传统意义上没有变量声明,它会在您分配时按需创建变量。
      但是,您可以使用= <value> cmdlet显式创建变量,这允许您控制其他方面,例如变量的范围。
  • PowerShell中的变量分配默认不输出任何内容,因此无需抑制任何输出(使用New-Variable| Out-Null,...)

  • 也就是说,您可以强制变量分配,通过将分配括在>$null 中来输出分配的值。

    • (...)
    • $v = 'foo' # no output

正如您所发现的那样,在($v = 'foo') # enclosed in () -> 'foo' is output中主动抑制输出是不必要的,因为简单地省略括号会使语句变得安静:($randomNumbers[$i] = $rand.Next(256)) 2>&1 | Out-Null;

最后,您可以使用$randomNumbers[$i] = $rand.Next(256) cmdlet 简化代码

Get-Random

这个单一的管道可以完成你的代码所做的一切(不确定性能,但可能无关紧要)。