我试图理解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
$_
是管道中当前的单个项目。要编写管道中的每个项目,您需要编写
get-data | foreach { Write-Host $_ }
或者缩写形式
get-data |% { Write-Host $_ }
从概念上讲,Foreach 是一个 cmdlet,它接收函数参数、管道输入并将函数应用于管道的每个项目。您不能只使用
$_
编写代码 - 您需要有一个函数明确声明它同意接收管道输入
$_ 指的是管道中的当前对象
确实,自动
$_
变量指的是当前管道输入对象,但仅在脚本块中 ({ ... }
),特别是那些传递给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 "..."
).
"$_"
)(位置上)绑定到 -Object
参数,pipeline input 就没有剩余参数可供绑定,这会导致手头的错误。