我有一个正则表达式扫描文件,并在管道中拉出一些值:
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 foo
和do-Something bar
。有十几种不同的方法来解决具体问题。我正在寻求增加对PowerShell管道的理解,所以我想知道如何将这些值直接混合到它中。
答案 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 $_ }