2016-01-03 3 views
1

У меня есть регулярное выражение сканирование файлов и потянув некоторые значения из них в трубопроводе:Как контактировать статью с конвейером?

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, поэтому я хотел бы знать, как смешать эти значения с ним напрямую.

+1

'& {command1; 'Foo'; Command2; 'бар'; command3} | {% делать-то $ _}' – PetSerAl

+0

@PetSerAl Я не уверен, я понимаю, как это согласуется с моим выше кодом ? Похоже, что он, вероятно, прав, но я просто не вижу его - можете ли вы опубликовать более расплывчатое решение в качестве ответа, и я соглашусь? –

+0

Моей догадкой была бы строка 2 в вопросе. '% {$ _ -match 'LoadJsModule \ (" (\ S +?) "'; -and 'foo' -and 'bar'} |? {$ _} |% {$ matches [1]} ' Смотрите, если что помогает – user4317867

ответ

1

Вы можете вводить две строки с помощью параметра ForEach-Object-End:

-End <ScriptBlock>
Указывает блок скрипта, который выполняется после обработки всех объектов ввода.

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 $_ } 
Смежные вопросы