如何将项目连接到管道?

时间:2016-01-03 20:53:53

标签: powershell

我有一个正则表达式扫描文件,并在管道中拉出一些值:

ls . -Include *.cs -Recurse | Select-String "LoadJsModule" |
   % { $_ -match 'LoadJsModule\("(\S+?)"'; } | ? { $_ } |
   % { $matches[1] } | % { do-Something $_ }

有点像

admin
invoices/app
warehouses/app

假设我注意到我的正则表达式管道正在获取我想要抓取的90%的东西,但缺少一些特殊情况 - 字符串“foo”和字符串“bar”。如何将这些正确添加到管道中,使其包含

admin
invoices/app
warehouses/app
foo
bar

然后我将每个传递给do-Something

请注意,我知道我可以运行上述内容,然后 do-Something foodo-Something bar。有十几种不同的方法来解决具体问题。我正在寻求增加对PowerShell管道的理解,所以我想知道如何将这些值直接混合到它中。

1 个答案:

答案 0 :(得分:1)

您可以通过ForEach-Object-End参数注入两个字符串:

  

<强>结束 - &LT;脚本块&GT;
  指定在处理所有输入对象后运行的脚本块。

ls . -Include *.cs -Recurse | Select-String "LoadJsModule" |
  % { $_ -match 'LoadJsModule\("(\S+?)"'; } | ? { $_ } |
  % -Process { $matches[1] } -End { 'foo', 'bar' } | % { do-Something $_ }

请注意,使用Select-String-match是多余的。由于您稍后使用$matches集合,因此我会放弃Select-String。另外,我在-match语句中运行Where-Object,而不是ForEach-Object

Get-ChildItem -Include *.cs -Recurse |
  Where-Object { $_ -match 'LoadJsModule\("(\S+?)"' } |
  ForEach-Object -Process { $matches[1] } -End { 'foo', 'bar' } |
  ForEach-Object { do-Something $_ }