get-date|Write-Host($_) 在概念上有什么问题

问题描述 投票:0回答:2

我试图理解Powershell,但发现有些东西不太直观。我的理解是,在管道中传递对象,而不是传统的文本。 $_ 指的是管道中的当前对象。那么,为什么以下不起作用:

get-date|Write-Host "$_"

错误信息是:

Write-Host :输入对象不能绑定到命令的任何参数,因为命令不接受管道输入或输入及其属性不匹配 h 接受管道输入的任何参数。 行数:1 字符:10 + 获取日期|写入主机 $_ + ~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (10-9-2014 15:17:00:PSObject) [Write-Host], ParameterBindingException +FullyQualifiedErrorId:InputObjectNotBound,Microsoft.PowerShell.Commands.WriteHostCommand

powershell
2个回答
11
投票

$_
是管道中当前的单个项目。要编写管道中的每个项目,您需要编写

get-data | foreach { Write-Host $_ }

或者缩写形式

get-data |% { Write-Host $_ }

从概念上讲,Foreach 是一个 cmdlet,它接收函数参数、管道输入并将函数应用于管道的每个项目。您不能只使用

$_
编写代码 - 您需要有一个函数明确声明它同意接收管道输入


0
投票

$_ 指的是管道中的当前对象

确实,自动

$_
变量指的是当前管道输入对象,但仅在脚本块中 (
{ ... }
)
,特别是那些传递给
ForEach-Object
Where-Object
cmdlet。

在脚本块之外,它没有有意义的值

因此,对您的命令的立即修复如下:

Get-Date | ForEach-Object { Write-Host $_ }

但是请注意:

  • Write-Host
    通常是错误使用的工具,除非目的是仅将 写入显示器,绕过成功输出流并能够将输出发送到其他命令,将其捕获在变量中,或将其重定向到文件。

  • 输出一个值(默认情况下打印到显示器),只需不要捕获它,如果它是命令的输出(例如,

    Get-Date
    ),或者,如果它存储在一个变量,使用后者本身;例如,
    $value
    ,而不是
    Write-Host $value
    (或使用
    Write-Output $value
    );请参阅这个答案
    要显式仅打印到显示器(而不是输出数据),但具有丰富的格式,请使用
    Out-Host

因此,如果仅仅以输出每个管道输入对象为目标,那么

Get-Date | ForEach-Object { $_ }
就可以了,其中如果每个输入对象只是简单地
传递
(不进行转换),则ForEach-Object调用是冗余;也就是说,在后一种情况下只需
Get-Date
即可。


至于你尝试过的

get-date|Write-Host "$_"

如上所述,在这种情况下使用

$_
是没有意义的,但您看到的错误消息的原因与该问题无关

相反,错误的原因是您错误地尝试通过管道

Write-Host通过参数
)向
Get-Date | Write-Host ...both
提供输入... | Write-Host "..."
.

  • 鉴于 argument (
    "$_"
    )(位置上)绑定到
    -Object
    参数,pipeline input 就没有剩余参数可供绑定,这会导致手头的错误。
© www.soinside.com 2019 - 2024. All rights reserved.