【问题标题】:How to pipeline variable cmdlets in Powershell?如何在 Powershell 中流水线化变量 cmdlet?
【发布时间】:2018-11-01 02:01:05
【问题描述】:

我想通过从以下简化示例中的参数插入管道步骤来参数化 Powershell 管道。

param (
    $path,
    $dataset,
    $processor
)

$datasetProcessor = Get-Command 'Convert-Noop'
if ( $processor.Keys -contains $dataset.Name ) {
    $datasetProcessor = $Processor[$dataset.Name]
}

Read-Dataset $dataset `
| $datasetProcessor `
| Export-Csv $path -NoTypeInformation

这会导致错误

表达式只能作为管道的第一个元素

也许它可以使用 Invoke-Expression 工作,但我将无法再使用调试器。

什么方法可行?

谢谢, 史蒂芬

【问题讨论】:

  • 我猜这个错误发生在你有Read-Dataset ...的地方。尝试删除反引号并将离开管道字符移动到行尾。 PowerShell 会自动在下一行查找管道的其余部分。请参阅我的这个旧答案以了解我在说什么:stackoverflow.com/questions/50406523/…。缩进是可选的,但可以使代码更具可读性。
  • 另外,注意:如果$processor 是一个看起来像它的哈希表,那么$processor.ContainsKey($dataset.Name)$processor.Keys -contains $dataset.Name 更好。哈希表是为快速查找而设计的,而-contains 运算符将扫描整个键数组。

标签: powershell pipeline powershell-cmdlet


【解决方案1】:

您已将脚本块(或从 get-command 返回的命令)指定为管道元素。这是一种表达方式。

要使用脚本块,请在其前面添加一个 &。

Read-Dataset $dataset `
| & $datasetProcessor `
| Export-Csv $path -NoTypeInformation

这是一个使用内置 cmdlet 的示例:

$sort=get-command sort-object

get-childitem | & $sort -property Length -descending

【讨论】:

  • 我也会按照@boxdog 的建议删除延续字符,但这些不应阻止它工作。
猜你喜欢
  • 2021-06-04
  • 2015-06-21
  • 2010-12-15
  • 2018-01-09
  • 2011-06-07
  • 2013-12-05
  • 2012-05-30
  • 1970-01-01
相关资源
最近更新 更多