【问题标题】:What is conceptually wrong with get-date|Write-Host($_)get-date|Write-Host($_) 在概念上有什么问题
【发布时间】:2014-11-04 03:54:02
【问题描述】:

我正在尝试了解 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

【问题讨论】:

  • Write-Host cmdlet 不接受管道输入,这就是您收到错误的原因。有关在这种情况下如何使用管道的示例,请参阅 LightningIsMyName。有许多 cmdlet 可以接受管道输入。 Write-Host 根本不是其中之一

标签: powershell


【解决方案1】:

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

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

或者简写

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

从概念上讲,Foreach 是一个 cmdlet,它接收函数参数、管道输入并将函数应用于管道的每个项目。您不能只使用$_ 编写代码 - 您需要有一个函数明确声明它同意接收管道输入

【讨论】:

  • 好的,我有点明白这一点,但不完全明白。根据“get-help Write-Host -parameter *”,位置参数 -Object 接受管道输入,并且确实“get-date|Write-Host”有效。那么,使用 $_ 代替管道输入和直接使用管道输入的命令有什么区别。是不是因为 $_ 是一个数组(因此需要 foreach),在这种情况下你能得到第一个像 $_[0] 这样的项目吗?
  • 虽然 Write-Host 愿意从管道获取它的输入(即,如果未指定 Object 参数会自动绑定到管道),但您对 Write-Host $_ 所做的是指定对象,所以它被绑定到$_ 而不是管道。但$_ 并不是真正的管道数据——它是一个变量,仅由 foreach 函数为您提供的函数定义
猜你喜欢
  • 2012-02-04
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
相关资源
最近更新 更多