PowerShell 抑制输出

3

我查看了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个回答

5

删除 int[]] $randomNumbers;。打印出来的不是赋值,而是空数组。


糟糕!抱歉因为愚蠢的错误,但感谢您的回答。计时器允许时我会接受它。我讨厌这种愚蠢的错误,但真的很感激您快速的回答,我已经在键盘上敲打了30分钟。 - Dan P
实际上,我甚至不需要抑制输出。$randomNumbers[$i] = $rand.Next(256) 就可以正常工作。我以为这就是输出所有零的原因。 - Dan P

2

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

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

++;当你发布这个问题时,我正在忙着构思我的答案,基本上是相同的想法。请注意,-Minimum 应该为 0(因此可以省略),以匹配 Random.Next Method (Int32) 的行为。 - mklement0
1
因为 0 是最小值的默认值,所以请使用 "Get-Random -maximum 256";我已经修改了我的代码。 - Esperento57

1

为了补充Andrey Marchuk的有效回答

  • [int[]] $randomNumbers 看起来像是一个类型限定的 PowerShell 变量声明,但由于没有赋值,它仅仅是一个强制转换:现有的 $randomNumbers 值 - 一个包含 10 个 0 的数组 - 会被强制转换为 [int[]](在这种情况下是一个无操作),然后输出 - 在这种情况下产生 10 行,每行都有一个 0

    • 一个真正的类型限定赋值,相当于你的 New-Object int[] 10 语句的等效(低效)写法是 [int[]] $randomNumbers = @( 0 ) * 10
      请注意,是 = <value> 的存在使此语句成为隐式创建变量的 赋值
    • PowerShell 没有传统意义上的变量 声明,它在需要时通过 赋值 来创建变量。
      但是,您可以使用 New-Variable cmdlet 显式地创建变量,这允许您控制其他方面,例如变量的作用域。
  • 在 PowerShell 中,变量赋值默认情况下不会输出任何内容,因此没有必要抑制任何输出(使用 | Out-Null>$null 等)。

  • 话虽如此,您可以通过将赋值括在 (...) 中来 强制 输出已分配的值

    • $v = 'foo' # 没有输出
    • ($v = 'foo') # 被括在 () 中 -> 'foo' 被输出
正如您发现的那样,在($randomNumbers[$i] = $rand.Next(256)) 2>&1 | Out-Null;中主动压制输出是不必要的,因为简单地省略括号就可以让语句保持安静:$randomNumbers[$i] = $rand.Next(256)
最后,你可以使用Get-Random cmdlet来简化你的代码:同时还需注意保留标签
[int[]] $randomNumbers = 1..10 | % { Get-Random -Maximum 256 } 

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

1
不太担心性能问题。我更多是在学习PowerShell的过程中进行调试。感谢您对变量声明的描述。我一直在为声明数组而苦苦挣扎,这也许就是为什么我还有那个不必要的额外行的原因。 - Dan P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接