我已经检查并尝试了一些关于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个零。每个作业一个。如何抑制输出?
答案 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
的存在使得此语句成为隐式创建变量的赋值。= <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
这个单一的管道可以完成你的代码所做的一切(不确定性能,但可能无关紧要)。