我们是否需要写输出?

时间:2016-07-08 16:27:34

标签: powershell powershell-v2.0 powershell-v3.0

让我们看看简短的PS片段:

Write-Output @(1,2,3)
Write-Output @(1,2,3).Count
Get-Process|Write-Output
Write-Output (Get-Process)
$p=7890;Write-Output "Var. is $p"
Write-Output "ABCD78".Length

Function Get-StoppedService {

Param([string]$Computername = $env:computername)

$s = Get-Service -ComputerName $Computername
$stopped = $s | where {$_.Status -eq 'Stopped'}
Write-Output $Stopped
}
Get-StoppedService

在上面的所有片段中,我可以删除字符串写入输出(带有尾随空格,如果有的话),并且具有完全相同的功能。 问题是:你知道我们不能放弃写输出的例子吗?当然,如果您对Write-Output的参数 -NoEnumerate 感兴趣,则无法消除cmdlet本身,因此我们假设我们不希望/需要 -NoEnumerate 。在这种情况下 - 你有例子吗?

2 个答案:

答案 0 :(得分:3)

MSDN本身具有以下statement

  

此cmdlet通常用于脚本中以显示字符串和其他字符串   控制台上的对象。但是,因为默认行为是   显示管道末端的对象,通常不是   必须使用cmdlet。例如,get-process |写输出   相当于get-process。

可能有用的一种情况是,当你构建一个具有未知阶段的管道时,即通过参数等给你的阶段,用户可以为你提供任何cmdlet,例如Tee-Object。如果用户不希望发生任何特殊情况,他可以简单地将Write-Output作为一种"传递"阶段(当然你也可以自己轻松实现)

答案 1 :(得分:1)

通常情况下,PetSerAl's简洁的例子(通过对问题的评论,在这种情况下)导致顿悟:

虽然一般 (请参阅DAXaholic's helpful answer;您Write-Output甚至不需要-NoEnumerate,因为可以使用一元数组构造运算符,)进行模拟, Write-Output可以提供语法糖

(Write-Output a b c d e | Measure-Object).Count会产生5,这表明Write-Output 接受任意数量的单个参数,这些参数通过管道发送到屏幕上之一。

因此,Write-Output可以简化将一组项目发送到输出流,而不是要求引用它们,因为,作为一个cmdlet,Write-Output& #39; s参数在argument mode中解析:

因此,而不是"嘈杂"数组文字,如下所示(需要引用元素并用,分隔):

"a", "b", "c", "d", "e"

你可以简单地写(尽管以牺牲性能为代价):

Write-Output a b c d e